我来自Java / Grails背景,似乎无法在线找到关于CakePHP应用程序的服务逻辑应该存储在何处的明确答案。通过“服务”,我说的是通常通过依赖注入实例化的类,以在域对象上执行业务逻辑。他们应该能够查询任何域对象并根据控制器操作进行更改。
目前,CakePHP的“Component”类似乎与此行为最匹配。我可以将组件加载到任何控制器中并根据需要执行其方法。但是,我已经在几个地方读过组件永远不应该访问数据库,这样做会导致一些陡峭的性能命中。
我也查看了CakePHP的“行为”类,它似乎根本不适合票。将域对象组织成数据结构设置似乎很有条件,但这不是服务执行的那种逻辑。另外,要将任何模型定义导入行为,我必须编辑模型定义本身以允许访问,这是非常尴尬的。
所以我问这个问题:服务逻辑应该存储在哪里?当然不是控制器,因为它应该只包含处理请求和发送响应的最小逻辑。
答案 0 :(得分:9)
组件是CakePHP中的服务层。它们由依赖注入容器(Components Collection)构造,并传递要处理的控制器,请求和响应。
除了保持层之间的分离之外,组件可以做什么没有限制。可以直接从组件使用数据库连接或使用模型并修改请求。
如果您只为特定情况采取行动,则组件实际上非常轻量级。检查操作名称是限制组件范围的常用方法。您还可以注入设置,以便知道何时可以执行自定义服务逻辑。
答案 1 :(得分:-2)
所以我问这个问题:服务逻辑应该存储在哪里? 当然不是控制器,因为它应该只包含最小值 处理请求和发送响应的逻辑。
听起来像Dispatcher Filter的理想用例。甚至在实例化控制器之前就会调用它。如果需要查询数据库,只需通过ClassRegistry :: init('YourModelName')加载模型,并将请求参数传递给模型方法,并在请求中返回您需要的任何内容。根本不需要控制器。我们使用Dispatcher Filters实现了oauth + xhttp,而无需调用控制器。
如何在组件中使用模型应该会影响性能...我不知道是谁有这个奇怪的想法,听起来不是你找到的最好的文章。确实,您不应该在其中放置与模型层相关的逻辑,但您可以通过控制器实例和控制器模型调用模型。