我想问题的简单答案是组件。
虽然我同意,但我觉得很难为某些特定的东西编写一个组件。
例如,假设我有一个用户表。创建用户时,它应该形成事件的连锁反应,在数据库周围启动与用户相关的不同类型的数据。我认为最好避免直接从不同的控制器操作数据库,而是将所有这些整齐地打包在方法中。然而,由于某些逻辑需要单独加入,我真的不能在一个方法中使用整个包。相反,我认为将它分解为较小的部分是合乎逻辑的(例如$userModelOrController->createNew()
和$candyStorageModelOrController->createNew())
只与各自的数据库表进行交互。
现在,如果将逻辑放到模型中,它将很有效,直到我需要使用其他模型。当然这是可能的,但与控制器中的加载模型相比,它并不那么简单。这就像一个蛋糕开发人员告诉我“当然,如果你想这样做就有可能,但这不是我会这样做的。”
然后,如果将逻辑放到控制器上,我可以通过$this->loadModel()
轻松访问其他模型,但这让我回到之前解释的情况,因为我需要能够无限期地继续连锁反应。从控制器访问其他控制器是可能的,但似乎没有任何直接的方法这样做,所以我猜我仍然没有做对。
通过使用组件,可以轻松解决此问题,因为组件可用于我想要的每个控制器。但就像我在开头写的那样,为这一项任务专门创建一个组件感觉很尴尬。对我来说,组件看起来更像是额外功能的包(如核心组件),而不是共享控制器特定逻辑的东西。
由于我是新手MVC的新手,我可能完全误解了这个概念。如果有人指出我正确的方向,我会再次感激:)
答案 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在代码中的任何位置插入。这样,