我扩展了我的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的构造函数中加载lang文件时遇到了一个问题。当从钩子调用时,它返回null
(当我正常使用它时返回true
),并且我在前端有关于未定义索引的通知。不,我不想禁用通知,我想解决这个问题。此外,我在MY_AdminController的构造函数中有配置加载,它们加载得很好。
你不能那样做,至少不能用那种特殊的方式。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'
);