【问题标题】:cakephp override construct in child controller子控制器中的 cakephp 覆盖结构
【发布时间】:2013-02-05 14:52:44
【问题描述】:

我想知道是否可以在 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->email$this->_constants['some_var'] 时,它们都为空。但是只要我将代码直接放在 SomeController.php 中而不是继承,它就起作用了。

我是不是做错了什么,或者这对蛋糕来说是不可接近的? 我也尝试了函数beforeFilter(),同样的事情发生了。 但是每个控制器都有自己的 beforeFilter() 是有道理的。

【问题讨论】:

  • 如果你打算覆盖构造函数,你应该先看看你在那里覆盖了什么。以及确切的构造函数参数是什么样的......提示:应该尊重类型提示
  • 你忘记设置了..??试试 $this->set 方法..
  • 这看起来像一个可怕的错误混乱。该任务仍然有一个 EmailComponent ,在构造函数中进行查找很尴尬。这看起来是一种完全错误的方法,不管它被认为是用来做什么的。

标签: oop class cakephp inheritance constructor


【解决方案1】:

我什至不会尝试覆盖 _construct' function of the appController. That's what thebeforeFilter,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'));
   }

}

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

【讨论】:

    猜你喜欢
    • 2011-12-05
    • 1970-01-01
    • 2013-09-17
    • 2013-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    相关资源
    最近更新 更多