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

CI3钩子文件加载模型报错,咨询实现方法与问题解决

CodeIgniter 3钩子中加载模型的错误排查与解决

问题描述

正在学习CodeIgniter 3的钩子功能,尝试在钩子文件中加载模型时触发以下错误:

错误信息1

A PHP Error was encountered
Severity: Warning

Message: Undefined property: Http_request_logger::$load

Filename: hooks/http_request_logger.php

Line Number: 9

错误信息2

An uncaught Exception was encountered
Type: Error

Message: Call to a member function model() on null

Filename: D:\xampp\htdocs\vobot-cms\application\hooks\http_request_logger.php

Line Number: 9

钩子代码

<?php
if (!defined('BASEPATH'))
    exit('No direct script access allowed');

class Http_request_logger {

    public function activity_user() {
        $CI = & get_instance();
        $this->load->model('./activity_user/MActivityUser');

       
        // log_message('info', 'GET --> ' . var_export($CI->input->get(null), true));
        $post = log_message('info', 'POST --> ' . var_export($CI->input->post(null), true));                
        // log_message('info', '$_SERVER -->' . var_export($_SERVER, true));

        $this->MActivityUser->insertLogActivity( $data = array(  
            'username' => (!$this->MActivityUser->getUsername() ? NULL : $this->MActivityUser->getUsername()),
            // 'domain' => $_SERVER["SERVER_NAME"],
            'menu_name' => $_SERVER["REQUEST_URI"],
            'activity' => $post,
            // 'ip' => $this->CI->input->ip_address(),
            'create_date' => date('Y-m-d H:i:s'),
            'cms_id' => $this->MActivityUser->getUserId()
    ));
    return $data;
    }

}

错误原因

  1. 钩子类Http_request_logger不属于CI框架的控制器/模型体系,没有内置的$load属性,直接使用$this->load会触发未定义属性错误。
  2. 虽然获取了CI实例$CI = & get_instance();,但后续未通过该实例加载模型,错误地使用当前类的$this操作CI的资源。

正确实现方式

修改钩子代码,通过CI实例加载并调用模型,同时修正日志记录的错误:

<?php
if (!defined('BASEPATH'))
    exit('No direct script access allowed');

class Http_request_logger {

    public function activity_user() {
        // 获取CI框架实例
        $CI = & get_instance();
        // 通过CI实例加载模型(去掉开头的./,CI会自动在models目录下查找)
        $CI->load->model('activity_user/MActivityUser');

        // 先获取POST数据,log_message无返回值,不能直接赋值
        $post_data = var_export($CI->input->post(null), true);
        log_message('info', 'POST --> ' . $post_data);                

        // 组装日志数据
        $data = array(  
            'username' => (!$CI->MActivityUser->getUsername() ? NULL : $CI->MActivityUser->getUsername()),
            'menu_name' => $_SERVER["REQUEST_URI"],
            'activity' => $post_data,
            'create_date' => date('Y-m-d H:i:s'),
            'cms_id' => $CI->MActivityUser->getUserId()
        );
        
        // 通过CI实例调用模型的插入方法
        $CI->MActivityUser->insertLogActivity($data);
        
        return $data;
    }

}

额外注意事项

  • log_message()函数仅用于记录日志,没有返回值,之前的赋值操作会导致$post为null,需先获取数据再传入日志函数。
  • 加载模型时,路径无需添加开头的./,CI会自动在application/models目录下定位文件。
  • 确保MActivityUser.php文件存在于application/models/activity_user/目录,且文件名与类名一致(CI3对文件名大小写敏感,通常首字母大写)。

内容的提问来源于stack exchange,提问作者ixxans

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 10:10:30