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

jpe*_*emi 6 components controller cakephp model

我想这个问题的简单答案就是一个组成部分.

虽然我同意,但我觉得很奇怪必须为一些特定的东西编写一个组件.

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

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

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

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

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

sib*_*iba 0

CakePHP 不容易支持,这是一个明确的错误

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

我最终主要是向超类 AppController 添加功能。

  • 如果您使用`ClassRegistry::init()`而不是`App::import()`,您可以继续不使用`new`关键字。:-) (2认同)
  • 啊?您可以关联模型以使它们易于访问。或者,您始终可以使用 ClassRegistry::init('MyModel') 在任何地方获取模型的实例。为了正确的 MVC 分离,您*不应该*在组件中执行此操作,但您*可以*。 (2认同)