这个问题在清除我对此事的困惑方面做得非常好,但我很难找到关于服务层的确切限制应该是什么的可靠来源.
对于这个例子,假设我们正在处理书籍,我们希望通过作者获得书籍.本BookDataMapper
可以有一个通用的get()
接受条件(S),如书的唯一标识符,作者姓名等这个实现是相当微不足道的(逻辑)方法,但如果我们希望有需要更复杂的查询多个条件是什么?
让我们说我们希望得到某位作者在特定出版商下撰写的所有书籍.我们可以扩展BookDataMapper->get()
方法来解析多个条件,或者我们可以编写一个新的方法,如BookDataMapper->getByAuthorAndPublisher()
.
是否最好让服务层直接调用这些[更具体]的方法,或者在调用BookDataMapper->get()
多个条件传递的更通用方法之前解析条件?在后一种情况下,服务层将执行更多逻辑"繁重的工作",使数据映射器相当简单.前一个选项会将服务层几乎完全缩减为中间人,将条件逻辑留给数据映射器等方法BookDataMapper->getByAuthorAndPublisher()
.
让服务层解析条件的一个明显问题是某些域逻辑泄漏出数据映射器.(这在此处的链接问题中进行了解释.但是,如果服务层要处理条件,则逻辑不会使其脱离模型层;控制器将无论如何调用$book_service->getByAuthorAndPublisher()
.
- 在Linux上运行PHP 5.3.8-
首先,我们已经解决了这个问题,直到函数返回预期值.然而,我仍然有很多未解决的问题,而"解决方案"更像是一个黑客攻击.
我在这个问题上度过了一天的大部分时间,所以当我解释所做的事情时,请耐心等待.首先,这个问题是返回值的get_browser()
就是FALSE
,这是不是文档返回值.这导致我假设FALSE
返回意味着函数内的某种错误状态.
经过多次迭代后,测试代码变得非常简单var_dump(get_browser($agent, true))
.我运行测试时都直接传递用户代理字符串,并且不传递任何参数,例如var_dump(get_browser())
,所有参数都具有相同的返回值.
尝试/验证的内容,返回值没有变化:
的browscap.ini:
权限:
bowscap.ini - 初始权限是644,但我已经尝试了644-777的所有内容
包含browscap.ini的目录 - 初始权限为755,也尝试了777
验证PHP可以使用其他功能访问文件和目录 file()
用户代理
尝试传递手动用户代理字符串
尝试传递$ _SERVER ['HTTP_USER_AGENT']
在远处的土地上与朋友验证了我的用户代理字符串 - get_browser()
按预期返回值.
php.ini中
browscap设置指向正确的位置
再次验证 echo count(file(ini_get('browscap')));
错误日志
文件结构
这是我怀疑错误来自的地方.browscap.ini生活在/var/php/
,它具有如上所述的适当权限.我的想法是,PHP可能无法访问此目录,或者沿着这些行.但是,此目录也是存储会话的位置,因此不太可能.
解决方案"
解决这个问题的原因是将browscap.ini移动到公共Web目录.我很好奇为什么会这样,特别是考虑到无证件的返回值."解决方案"有效,但不是我认为我会找到的解决方案......
是否get_browser()
有特殊权限要求,或类似的东西?file()
可以访问目录和文件很好,但get_browser()
不能(大概).在这个问题上,我几乎把头发拉了出来,并希望得到一些解决方案!
谢谢阅读!