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