You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CodeIgniter钩子中无法访问Session问题求助

解决CodeIgniter钩子中Session访问的“Trying to get property of non-object”错误

看起来你遇到的问题核心是钩子触发时机不对,导致Session类还没初始化就被调用了。让我一步步帮你排查和解决:

错误原因分析

你用的是pre_controller钩子,这个钩子的执行时机是控制器加载但还未实例化的阶段。此时CodeIgniter的核心库(包括Session)还没有完成初始化——哪怕你在autoload.php里配置了自动加载Session,它也是在控制器构造完成后才会被加载的。所以当你尝试访问$this->CI->session时,这个对象还不存在,就会抛出“Trying to get property of non-object”的错误。

解决方案:调整钩子触发时机

最稳妥的方式是把钩子的触发时机改成post_controller_constructor,这个时机是控制器已经构造完成,所有自动加载的库(包括Session)都已初始化,此时就能正常访问Session了。

步骤1:修改钩子配置

打开application/config/hooks.php,把原来的pre_controller钩子改成post_controller_constructor:

$hook['post_controller_constructor'] = array(
    'class' => 'Preclass',
    'function' => 'your_function_name', // 或者直接在类的构造函数里处理逻辑
    'filename' => 'Preclass.php',
    'filepath' => 'hooks'
);

步骤2:完善钩子类代码

确保你的钩子类里正确获取CI实例并处理Session操作,如果没自动加载Session的话,也可以手动加载:

class Preclass {
    private $CI;

    public function __construct() {
        // 获取CI实例
        $this->CI =& get_instance();
        
        // 确保Session库已加载(如果没在autoload里配置的话)
        if (!isset($this->CI->session)) {
            $this->CI->load->library('session');
        }

        // 获取当前URL并存入Session
        // 如果你需要完整URL,可以用 $_SERVER['REQUEST_URI'] 或者CI的input类
        $current_url = $this->CI->input->server('REQUEST_URI');
        // 或者只获取路由部分:$current_url = $this->CI->uri->uri_string();
        
        $this->CI->session->set_userdata('current_url', $current_url);
    }

    // 如果你的钩子用的是单独的函数(而非类的构造),可以写在这里
    // public function your_function_name() {
    //     // 上面的逻辑放在这里
    // }
}

步骤3:检查Session自动加载配置

打开application/config/autoload.php,确保Session库被自动加载,避免手动加载的麻烦:

$autoload['libraries'] = array('session');

可选:如果一定要用pre_controller钩子

如果你有特殊需求必须用pre_controller,那需要在钩子类里手动加载Session库,但这种方式可能会有潜在问题(因为部分依赖还未准备好),代码示例:

class Preclass {
    private $CI;

    public function __construct() {
        $this->CI =& get_instance();
        // 手动加载Session库
        $this->CI->load->library('session');
        // 后续的Session操作...
    }
}

额外检查点

  • 确认config.php里的Session配置正确,比如CI3+的sess_driver、sess_cookie_name等参数,确保Session能正常工作;
  • 检查服务器的Session存储权限(比如用文件驱动的话,application/session目录需要可写权限)。

内容的提问来源于stack exchange,提问作者B. Desai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:00:07