根据此处的Codeignitor文档:http : //ellislab.com/codeigniter/user-guide/general/hooks.html,它指出:
pre_controller在调用任何控制器之前立即调用。所有基类,路由和安全性检查均已完成。
但是,如果我使用以下方法创建一个钩子pre_controller钩子:
$hook['pre_controller'][] = array(
'class' => 'tester',
'function' => 'test',
'filename' => 'tester.php',
'filepath' => 'models',
//'params' => array('beer', 'wine', 'snacks')
);
Run Code Online (Sandbox Code Playgroud)
文件tester.php是:
class tester extends CI_Model
{
public function __construct()
{
parent::__construct();
$this->load->library('migration');
}
public function test()
{
echo "hi";
exit;
}
}
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
Fatal error: Class 'CI_Model' not found in ******.php
Run Code Online (Sandbox Code Playgroud)
为什么不加载CI_Model?如果我放了require_once('system / core / Model.php'); 在pre_controller定义上方的hooks.php文件中,出现以下错误:
Fatal error: Call to a member function library() on a non-object in ****.php
Run Code Online (Sandbox Code Playgroud)
由于实际上并未加载CI_Model,因此诸如library()之类的功能将无法正常工作。如何强制其引导CI_Model。
第一个说“ Use post_controller_constructor”的人会被枪击,因为那没有回答问题。在从控制器类运行任何构造函数之前,我需要它加载。我需要访问以从pre_controller挂钩扩展CI_Model类。
简短的答案是CodeIgniter无法按照您希望的方式工作。在您尝试访问模型的阶段,CodeIgniter尚未加载必需的类,并且该类不可用。根据您要实现的目标,可能还有另一种方法可以实现-不使用钩子/不使用后面的钩子?
观看中 /system/core/CodeIgniter.php将显示何时调用每个钩子以及何时执行其他任务。加载路由,加载全局功能等。
如果您坚持使用此挂钩,则可以添加以下内容: load_class('Model', 'core');在模型文件的顶部(声明类之前)但这是一个非常肮脏的修复程序。
确保您的类名称遵循正确的命名约定- tester应该为Tester。
编辑:由于要在每个调用上运行相同的代码(假设每个控制器调用),这是一个可能的解决方案:
扩展核心控制器,并将此新控制器用作所有其他控制器的基本控制器(因为它们将共享相同的功能)。在此新基本控制器的构造函数中,添加要在每个调用上运行的功能。该构造函数中的代码将在您的任何控制器中的任何其他代码之前被调用。
创建以下文件application/core/MY_Controller.php。
class MY_Controller extends CI_Controller {
function __construct()
{
parent::__construct();
// Do whatever you want - load a model, call a function...
}
}
Run Code Online (Sandbox Code Playgroud)
application/controllers用MY_Controller而不是扩展每个控制器CI_Controller。
class Welcome extends MY_Controller {
function __construct()
{
parent::__construct();
}
// Your controllers other functions...
}
Run Code Online (Sandbox Code Playgroud)