小编oro*_*kek的帖子

谁应该处理复杂查询,数据映射器或服务层中的条件?

这个问题在清除我对此事的困惑方面做得非常好,但我很难找到关于服务层的确切限制应该是什么的可靠来源.

对于这个例子,假设我们正在处理书籍,我们希望通过作者获得书籍.本BookDataMapper可以有一个通用的get()接受条件(S),如书的唯一标识符,作者姓名等这个实现是相当微不足道的(逻辑)方法,但如果我们希望有需要更复杂的查询多个条件是什么?

让我们说我们希望得到某位作者在特定出版商下撰写的所有书籍.我们可以扩展BookDataMapper->get()方法来解析多个条件,或者我们可以编写一个新的方法,如BookDataMapper->getByAuthorAndPublisher().

是否最好让服务层直接调用这些[更具体]的方法,或者在调用BookDataMapper->get()多个条件传递的更通用方法之前解析条件?在后一种情况下,服务层将执行更多逻辑"繁重的工作",使数据映射器相当简单.前一个选项会将服务层几乎完全缩减为中间人,将条件逻辑留给数据映射器等方法BookDataMapper->getByAuthorAndPublisher().

让服务层解析条件的一个明显问题是某些域逻辑泄漏出数据映射器.(这在此处的链接问题中进行了解释.但是,如果服务层要处理条件,则逻辑不会使其脱离模型层;控制器将无论如何调用$book_service->getByAuthorAndPublisher().

php domain-driven-design datamapper

17
推荐指数
2
解决办法
3253
查看次数

get_browser()返回FALSE

- 在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')));

错误日志

  • 检查PHP和Apache错误日志是否提及'browscap'或任何甚至密切相关的东西 - 没有什么不寻常的.

文件结构

这是我怀疑错误来自的地方.browscap.ini生活在/var/php/,它具有如上所述的适当权限.我的想法是,PHP可能无法访问此目录,或者沿着这些行.但是,此目录也是存储会话的位置,因此不太可能.

解决方案"

解决这个问题的原因是将browscap.ini移动到公共Web目录.我很好奇为什么会这样,特别是考虑到无证件的返回值."解决方案"有效,但不是我认为我会找到的解决方案......

是否get_browser()有特殊权限要求,或类似的东西?file()可以访问目录和文件很好,但get_browser()不能(大概).在这个问题上,我几乎把头发拉了出来,并希望得到一些解决方案!

谢谢阅读!

php browscap

10
推荐指数
2
解决办法
4463
查看次数

标签 统计

php ×2

browscap ×1

datamapper ×1

domain-driven-design ×1