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
相关产品推荐
相关产品推荐

