CakePHP组件还是其他控制器类?

时间:2012-07-25 20:32:22

标签: php cakephp cakephp-2.0

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

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

2 个答案:

答案 0 :(得分:2)

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

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

  1. MultiStepController
  2. SecurityController
  3. MultiStepSecurityController
  4. 如果您想要添加一种新类型的控制器,那么您必须创建4个新的控制器子类:

    1. FooMultiStepController
    2. FooSecurityController
    3. FooMultiStepSecurityController
    4. FooController
    5. 与仅将'Foo'添加到您想要使用该组件的任何控制器的$components变量相比,这是很多冗余代码和不必要的工作。

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

答案 1 :(得分:1)

有关components-class的文档:

  

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

     

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

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

您当然可以使用自定义类(它仍然只是PHP)实现所有这些功能。此外,在以后重新使用其他应用程序中的组件可能比重新使用自定义类要容易得多。

有关详细信息,请参阅docs或(通常非常有用!)API

相关问题