codeigniter - pre_controller 钩子(Hook)不会加载像 docs state 这样的基类吗?

标签 codeigniter hook

根据此处的 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/

相关文章:

codeigniter - 使用 codeigniter 发送邮件

git - 在 git push 上硬重置

redis - 是否可以在 key 过期之前 Hook redis

msbuild - 创建 MSBuild 目标 Hook

c# - 捕获鼠标和键盘事件并在 C# 和 "prevent system propagation"

mysql - 无法使用现有表在 bonfire 中创建模块

php - Codeigniter,钩子(Hook)未正确加载输入类

php - Javascript window.onload 不会在每台计算机上加载

php - codeigniter 事件记录 : Fields lost when performing a JOIN

wordpress - 如何在 WordPress 中创建 'route' ?