根据此处的 Codeignitor 文档:http://ellislab.com/codeigniter/user-guide/general/hooks.html它指出:
预 Controller 在调用任何 Controller 之前立即调用。所有基类、路由和安全检查均已完成。
但是,如果我创建一个钩子(Hook) pre_controller 钩子(Hook):
$hook['pre_controller'][] = array(
'class' => 'tester',
'function' => 'test',
'filename' => 'tester.php',
'filepath' => 'models',
//'params' => array('beer', 'wine', 'snacks')
);
文件 tester.php 是:
class tester extends CI_Model
{
public function __construct()
{
parent::__construct();
$this->load->library('migration');
}
public function test()
{
echo "hi";
exit;
}
}
我收到此错误:
Fatal error: Class 'CI_Model' not found in ******.php
为什么没有加载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
由于它实际上并未加载CI_Model,因此library()等函数将不起作用。如何强制它引导 CI_Model。
第一个说“使用 post_controller_constructor
”的人将被一见到就被 Gunicorn ,因为这没有回答问题。我需要它在运行 Controller 类中的任何构造函数之前加载它。我需要从 pre_controller Hook 扩展 CI_Model 类。
最佳答案
简短的回答是 CodeIgniter 无法按照您希望的方式工作。在您尝试访问模型的阶段,CodeIgniter 尚未加载所需的类,并且该类不可用。根据您想要实现的具体目标,可能还有另一种方法可以实现此目的 - 不使用钩子(Hook)/使用稍后的钩子(Hook)?
查看/system/core/CodeIgniter.php
将显示每个钩子(Hook)何时被调用以及何时执行其他任务;加载路由、加载全局函数等
如果您坚持使用这个钩子(Hook),那么您可以添加:load_class('Model', 'core');
在模型文件的顶部(在声明类之前),但这将是一个非常肮脏的修复。
确保您的类名称遵循正确的命名约定 - tester
应为 Tester
。
编辑:由于您希望在每次调用时运行相同的代码(假设每次 Controller 调用),这是一个可能的解决方案:
扩展核心 Controller ,并使用这个新 Controller 作为所有其他 Controller 的基本 Controller (因为它们将共享相同的功能)。在此新基本 Controller 的构造函数中,添加您想要在每次调用时运行的功能。此构造函数中的代码将在任何 Controller 中的任何其他代码之前被调用。
创建以下文件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...
}
}
使用MY_Controller
而不是CI_Controller
扩展application/controllers
中的每个 Controller 。
class Welcome extends MY_Controller {
function __construct()
{
parent::__construct();
}
// Your controllers other functions...
}
关于codeigniter - pre_controller 钩子(Hook)不会加载像 docs state 这样的基类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22805828/