0

我已经像这样扩展了我的 CI_Controller:

// base extend
class MY_Controller extends CI_Controller {
      public $CI = array();

      public function __construct() {
        parent::__construct();
        $this->CI = & get_instance();
      }
      public function isUser(){
      // for example
      }
}

// admin extended
class MY_AdminController extends MY_Controller {

     public $admin = array();

     public function __construct() {

        parent::__construct();

        $this->CI->lang->load('admin');

        $this->admin['lang'] = $this->CI->lang->line('admin');

        $this->CI->load->vars($this->admin);

     }


     public function isAdmin(){
     //for example
     }
}

// extends for modules
class MY_AdminModuleController extends MY_AdminController {
     public function __construct() {
        parent::__construct();
        $this->CI->load->view('_header');
     }
     public function isAllowedModule(){
     // example
     }
     public function pseudoDestruct(){
        $this->CI->load->view('_footer');
     }
}

所以它工作正常。但是我尝试挂钩post_controller事件并添加我的MY_AdminModuleController->pseudoDestruct(),所以我在 config.php 中启用了挂钩,并在挂钩中添加了下一行:

$hook['post_controller'] = array(
    'class' => 'MY_AdminModuleController',
    'function' => 'pseudoDestruct',
    'filename' => 'MY_Controller.php',
    'filepath' => 'core'
);

但是我在 MY_AdminController 的构造函数中加载语言文件时遇到了问题。它null在从钩子调用时返回(true当我正常使用它时)并且我注意到前端未定义索引。不,我不想禁用通知,我想解决问题。此外,我在 MY_AdminController 的构造函数中加载了配置,并且加载良好。

4

1 回答 1

1

你不能这样做,至少不能以那种特定的方式。CodeIgniter 设计为只有一个控制器实例,而钩子会创建新实例,并且您的 lang 文件不会加载到该新实例中。此外,您不需要get_instance()从控制器类调用 - 类是get_instance()返回的。

无论如何,您可以声明一个常规函数用作钩子,将它放在您的 MY_Controller.php 文件中也没有问题:

function pseudo_destruct()
{
    get_instance()->load->view('_footer');
}

然后使用这个钩子:

$hook['post_controller'] = array(
    'function' => 'pseudo_destruct',
    'filename' => 'MY_Controller.php',
    'filepath' => 'core'
);
于 2013-09-04T09:35:54.237 回答