要在控制器类之间使用相同的逻辑,我们可以创建components。但我想知道组件对自定义类有什么优点?CakePHP组件或其他控制器类?
我们可以在另一个类中构造一个控制器类的实例。所以我们可以使用与$MyOtherController->myAction
相同的逻辑,而不是$this->MyComponent->myAction
。
你可以比较它们吗?或者我错过了什么?
要在控制器类之间使用相同的逻辑,我们可以创建components。但我想知道组件对自定义类有什么优点?CakePHP组件或其他控制器类?
我们可以在另一个类中构造一个控制器类的实例。所以我们可以使用与$MyOtherController->myAction
相同的逻辑,而不是$this->MyComponent->myAction
。
你可以比较它们吗?或者我错过了什么?
CakePHP组件和行为基本上是装饰器模式的应用程序。虽然您可能认为通过继承AppController
类可以获得相同的结果,但如果您考虑组件可能用于的所有不同组合,则需要创建一个庞大的子类来获得与仅仅一个少数组件。相反,您可以通过依赖注入来随意混合和匹配组件/行为。
比方说你现在有3个控制器子类:
MultiStepController
SecurityController
MultiStepSecurityController
如果你要拿出一个新类型的控制器您想添加,那么你必须创建4个新的控制器子类:
FooMultiStepController
FooSecurityController
FooMultiStepSecurityController
FooController
这是一个很大的冗余代码和不必要的工作相比,只是增加'Foo'
任何控制器的$components
变量你想使用的组件in。
所以从mai的角度可持续性和代码重用,在大多数情况下,组件是比子类更好的解决方案。
有关组件级的文档:
为单个组件的基类。组件提供了可以组成控制器的可重用控制器逻辑。组件还提供了在特定点注入逻辑的请求生命周期回调。
组件可以提供多个在请求周期的各个阶段触发的回调。可用的回调是:
- initialize() - 在控制器的beforeFilter方法之前触发。
- startup() - 在控制器的beforeFilter方法之后触发。
- beforeRender() - 在视图+布局呈现之前触发。
- shutdown() - 在动作完成并且已经呈现视图但在Controller :: afterFilter()之前触发。
- beforeRedirect() - 在重定向()完成之前触发。
你当然也可以实现这一切使用自定义类(它仍然只是PHP)。以后在其他应用程序中重新使用组件可能比重新使用自定义类容易得多。