CakePHP:在哪里放置“服务”逻辑?

9
我来自Java/Grails背景,无法在网上找到关于CakePHP应用程序的服务逻辑应该存储在哪里的明确答案。“服务”指的是通常通过依赖注入实例化以对域对象执行业务逻辑的类。它们应该能够查询任何域对象并根据控制器操作进行更改。
目前,CakePHP的“Component”类似乎最符合此行为。我可以将组件加载到任何控制器中,并根据需要执行其方法。但是,我已经在几个地方读到,组件永远不应该访问数据库,这样做会导致严重的性能问题。
我还研究了CakePHP的“Behavior”类,但它似乎完全不适合此项任务。它似乎很适合将域对象组织成数据结构设置,但这不是服务执行的逻辑类型。此外,要将任何模型定义导入到行为中,我必须编辑模型定义本身以允许访问,这非常麻烦。
因此,我提出了这个问题:服务逻辑应该存储在哪里?当然不是控制器,因为它只应包含最少的处理请求和发送响应的逻辑。

3
这里有一个免费的提示:远离CakePHP。它是PHP中最糟糕的框架之一,绝对没有实现任何类似MVC的东西。如果想使用至少认可“服务”概念的东西,可以尝试Symfony2。 - tereško
参数1:全局状态。CakePHP基本上是围绕着单例和其他静态作用域参数的使用构建的。 - tereško
@burzum..我希望5个参数对你来说足够了。为什么你删除了评论? - tereško
1
@tereško 我没有删除它,猜想是某个版主。我同意1和2,也不喜欢它。我不同意3,它可能不是MVC,但它的工作方式很好。我个人喜欢愚蠢的模板。4部分正确,5对于2.0来说不是真的。我自己尝试过推动一些对CakePHP的更改,但老实说,让事情发生变化很痛苦,最终更多的是讨论而不是有成效的工作。所以我放弃了,希望能等到3.0版本。 - floriank
1
由于其他人可能会来到这里并查看这些评论,我只想提醒新手。我认为所有的争论都可以在CakePHP 3.X版本中解决。我们的团队发现它非常易于维护,并且在必要时很容易进行不同类型的架构调整。 - Süha Boncukçu
显示剩余5条评论
2个回答

11

组件是CakePHP中的服务层。它们由一个依赖注入容器(组件集合)构建,并传递给要处理的控制器、请求和响应。

与维护分层之间的分离以外,组件可以做任何事情。从组件直接使用数据库连接或模型并修改请求是可以的。

如果只让组件针对特定情况执行任务,那么它们实际上非常轻量级。检查操作名称是限制组件范围的常见方法。您还可以注入设置,以便它知道何时执行自定义服务逻辑是OK的。


-2
所以我问这个问题:服务逻辑应该存储在哪里呢? 当然不是控制器,因为它只应包含最小的逻辑来处理请求和发送响应。
听起来像是Dispatcher Filter的理想用例。它甚至在实例化控制器之前就被调用了。如果您需要查询数据库,只需通过ClassRegistry::init('YourModelName')加载模型,并将请求参数传递给模型方法并返回您在请求中需要的任何内容。根本不需要控制器。我们使用Dispatcher Filters实现了oauth + xhttp,而从未调用过控制器。
如何在组件中使用模型会影响性能...我不知道谁有这个奇怪的想法,听起来不是你找到的最好的文章。确实,您不应该在组件中放置与模型层相关的逻辑,但是您可以通过控制器实例和控制器的模型来调用模型。

“服务逻辑”主要代表存储抽象和领域实体之间的交互。你的回答与此无关。甚至,CakePHP 也没有将模型层的这两个方面分开,因为它在其 AppModel 类中使用了 ActiveRecord。 - tereško
@burzum 经过一些阅读,我觉得 DispatcherFilter 对于 API 调用等功能非常适合。然而,我的许多逻辑更为广泛。例如,当我收到一个认证失败的 POST 请求时,我需要将失败的登录尝试记录到数据库中。虽然这是一个简单的概念,但实例化一个新记录、验证和持久化它需要相当多的代码。这种计算不属于控制器,因为它与请求或响应没有直接关系。您仍然会推荐 DispatcherFilter 用于这样的任务吗? - emagdne
1
调度程序过滤器适用于中间件逻辑,但组件更适合他所描述的内容。 - José Lorenzo Rodríguez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接