在CakePHP中共享应用程序逻辑的正确位置是什么?

时间:2010-06-17 19:20:44

标签: cakephp model controller components

我想问题的简单答案是组件

虽然我同意,但我觉得很难为某些特定的东西编写一个组件。

例如,假设我有一个用户表。创建用户时,它应该形成事件的连锁反应,在数据库周围启动与用户相关的不同类型的数据。我认为最好避免直接从不同的控制器操作数据库,而是将所有这些整齐地打包在方法中。然而,由于某些逻辑需要单独加入,我真的不能在一个方法中使用整个包。相反,我认为将它分解为较小的部分是合乎逻辑的(例如$userModelOrController->createNew()$candyStorageModelOrController->createNew())只与各自的数据库表进行交互。

现在,如果将逻辑放到模型中,它将很有效,直到我需要使用其他模型。当然这是可能的,但与控制器中的加载模型相比,它并不那么简单。这就像一个蛋糕开发人员告诉我“当然,如果你想这样做就有可能,但这不是我会这样做的。”

然后,如果将逻辑放到控制器上,我可以通过$this->loadModel()轻松访问其他模型,但这让我回到之前解释的情况,因为我需要能够无限期地继续连锁反应。从控制器访问其他控制器是可能的,但似乎没有任何直接的方法这样做,所以我猜我仍然没有做对。

通过使用组件,可以轻松解决此问题,因为组件可用于我想要的每个控制器。但就像我在开头写的那样,为这一项任务专门创建一个组件感觉很尴尬。对我来说,组件看起来更像是额外功能的包(如核心组件),而不是共享控制器特定逻辑的东西。

由于我是新手MVC的新手,我可能完全误解了这个概念。如果有人指出我正确的方向,我会再次感激:)

5 个答案:

答案 0 :(得分:3)

每当我面对如此困难的情景时,我会盯着 CakePHP Events System 无数个小时。

我到目前为止设法以某种方式避免(主要是由于缺乏勇气),但我认为值得研究,因为它显然是为了将MVC“墙”跳到某种程度上。

另一个可能的解决方案是 Finite State Machine behavior ,它允许您更清晰地将逻辑推向模型并围绕它构建Controller + Component。此行为的唯一回退(IMHO)是它不允许单个模型上的多个state字段。

这种问题的更实际的表现可能会产生更好的解决方案,因为我们中的许多人走上了这条路,这可能是一个有价值的例子。

答案 1 :(得分:0)

对于CakePHP不容易支持的deifinitley窃听

  • 从模型中访问另一个模型
  • 从模型中访问组件
  • 从组件访问任何模型
  • 具有可从控制器和视图访问的功能(组件和助手之间的某些功能),或从助手访问组件(或反之亦然)

我最终将函数添加到超类AppController。

答案 2 :(得分:0)

cookbook中明确说明:“组件是控制器之间共享的逻辑包。如果您发现自己想要在控制器之间复制和粘贴内容,可以考虑将一些功能包装在一个组件。“

答案 3 :(得分:0)

如果您希望模型共享某些逻辑,则可以使用AppModel。如果您需要访问模型中的不同模型,可以使用App::import()ClassRegistry::init。现在,如果您希望逻辑只对您选择的某些模型可用,您可以使用Behavior或创建一个不同的AppModel,只有您选择的模型才会继承。

答案 4 :(得分:0)

实现此功能的更好方法可能是在插件中。插件允许您将MVC所有部分的整个功能封装到一个包中,该包可以通过插件的Helpers,Components,Behaviors在代码中的任何位置插入。这样,

  • 您可以将功能放在最合适的位置,
  • 逻辑与其他应用逻辑分开,
  • 您可以根据需要启用/禁用此功能。