2

要在控制器类之间使用相同的逻辑,我们可以创建组件。但我想知道组件对自定义类有什么好处?

我们可以在另一个类中构造一个控制器类的实例。所以我们可以使用与$MyOtherController->myAction而不是相同的逻辑$this->MyComponent->myAction
你能比较它们吗?还是我错过了什么?

4

2 回答 2

2

CakePHP 组件和行为基本上是装饰器模式的应用。虽然您可能认为通过对类进行子类化可以获得相同的结果AppController,但如果您要考虑可能使用组件的所有不同组合,这将需要您创建大量子类来实现与少数几个相同的结果的组件。相反,您可以通过依赖注入随意混合和匹配组件/行为。

假设您目前有 3 个控制器子类:

  1. MultiStepController
  2. SecurityController
  3. MultiStepSecurityController

如果你想出一种你想要添加的新型控制器,那么你必须创建 4 个新的控制器子类:

  1. FooMultiStepController
  2. FooSecurityController
  3. FooMultiStepSecurityController
  4. FooController

'Foo'与仅添加到$components您想要在其中使用组件的任何控制器的变量相比,这是很多冗余代码和不必要的工作。

因此,从可维护性和代码重用的角度来看,在大多数情况下,组件是比子类化更好的解决方案。

于 2012-07-26T01:08:40.847 回答
1

关于组件类的文档:

单个组件的基类。组件提供可重用的控制器逻辑位,可以组合成一个控制器。组件还提供请求生命周期回调,用于在特定点注入逻辑。

组件可以提供多个在请求周期的不同阶段触发的回调。可用的回调是:

  • initialize() - 在控制器的 beforeFilter 方法之前触发。
  • startup() - 在控制器的 beforeFilter 方法之后触发。
  • beforeRender() - 在视图 + 布局渲染之前触发。
  • shutdown() - 在操作完成并且视图已经渲染但在 Controller::afterFilter() 之前触发。
  • beforeRedirect() - 在 redirect() 完成之前触发。

您当然可以使用自定义类来实现所有这些(它仍然只是 PHP)。稍后在另一个应用程序中重用组件可能比重用自定义类容易得多。

有关更多信息,请参阅文档或(通常非常有用!)API

于 2012-07-25T21:09:29.403 回答