cakephp覆盖子控制器中的构造

时间:2013-02-20 14:46:19

标签: oop class cakephp inheritance constructor

我想知道是否可以继承/覆盖cakephp中子控制器中的构造函数。

在我的 AppController.php

我喜欢这样:

public function __construct( $request = null, $response = null ) {
    parent::__construct( $request, $response );

    $this->email = new CakeEmail();

    $this->_constants = array();
    $this->_constants['some_var'] = $this->Model->find( 'list', array(
        'fields' => array( 'Model.name', 'Model.id' )
    ) );
}

在我的子控制器 SomeController.php 中,它继承了父构造函数

public function __construct( $request = null, $response = null ) {
    parent::__construct( $request, $response );
}

当我尝试访问 $ this->电子邮件 $ this-> _constants ['some_var'] 时,它们都为空。但是,只要我将代码直接放在SomeController.php而不是继承中,它就会起作用。

我做错了什么,或者这对蛋糕来说根本不平易近人? 我也尝试使用函数 beforeFilter(),同样的事情发生了。 但有意义的是每个控制器都有自己的 beforeFilter()

1 个答案:

答案 0 :(得分:4)

我甚至不会尝试覆盖_construct' function of the appController. That's what the beforeFilter , beforeRender`方法。看起来你只是想从appController传递vars到每个控制器。你可以这样做......

class AppController extends Controller {

   var $_constants = array();

   public function beforeFilter(){
      $this->_constants[] = array('this', 'that', 'the other');
   }

}

在您的模型控制器中,您可以像这样访问变量......

class UsersController extends AppController {

   public function add(){
      pr($this->_constants);
   }
}

如果您尝试将变量发送到视图(稍微),这是一个不同的故事。只需使用set方法

class AppController extends Controller {

   public function beforeFilter(){
      $this->set('_constants', array('this', 'that', 'the other'));
   }

}

并且在任何视图中,您都可以使用_constants调用pr($_constants);变量。因为它在appController中,所以它应该在每个视图上都可用。