CakePHP组件或其他控制器类


CakePHP component or another controller class?

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

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

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

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

  1. MultiStepController
  2. SecurityController
  3. MultiStepSecurityController

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

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

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

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

关于组件类的文档:

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

组件可以提供在请求周期的各个阶段激发的几个回调。可用的回调有:

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

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

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