Codeigniter(HMVC) pre_controller钩子中核心类无法加载的技术求助
解决CodeIgniter HMVC中pre_controller钩子无法加载核心类的问题
我来帮你搞定这个问题~首先得搞清楚为什么会出现这种情况:
在CodeIgniter的钩子体系里,
pre_controller的触发时机是控制器类刚加载但还没实例化的时候,这时候CI的核心组件(比如负责路由的Router类)其实还没完成初始化。放到HMVC架构下,这个阶段的核心组件初始化进度会更慢,所以你想通过$this->CI->router获取路由信息自然会失败。
下面给你两个可行的解决方案:
方案1:换成post_controller_constructor钩子(推荐)
这是最省心的办法,因为这个钩子是在控制器已经实例化完成,但具体方法还没执行的时候触发的,此时所有核心组件都已经准备就绪,包括Router类。
你只需要修改application/config/hooks.php里的钩子配置:
$hook['post_controller_constructor'] = array( 'class' => 'Authentication', 'function' => 'is_loggedin', 'filename' => 'Authentication.php', 'filepath' => 'hooks', 'params' => array() );
然后你的is_loggedin方法就能正常获取类和方法信息了:
public function is_loggedin(){ $class = $this->CI->router->fetch_class(); $method = $this->CI->router->fetch_method(); echo "当前类:{$class},当前方法:{$method}"; }
方案2:在pre_controller里手动初始化核心类(不推荐)
如果你非得在pre_controller阶段执行逻辑,那可以手动初始化Router类,但要注意HMVC的兼容性,步骤如下:
在你的钩子类构造函数里,手动加载并初始化Router:
public function __construct() { $this->CI = & get_instance(); // 手动初始化Router组件 $this->CI->load->library('router'); $this->CI->router->_set_routing(); }
不过这种方式我不太推荐,因为HMVC对路由有额外的扩展处理,手动初始化可能会导致路由信息不准确,甚至和HMVC的逻辑冲突。
小提示
在HMVC里,你还可以用$this->CI->router->fetch_module()获取当前模块的名称,这是HMVC专门扩展的方法,原生CI没有这个功能哦~
内容的提问来源于stack exchange,提问作者Nirali Kavar
相关产品推荐
相关产品推荐

