CI3钩子文件加载模型报错,咨询实现方法与问题解决
CodeIgniter 3钩子中加载模型的错误排查与解决
问题描述
正在学习CodeIgniter 3的钩子功能,尝试在钩子文件中加载模型时触发以下错误:
错误信息1
A PHP Error was encountered
Severity: WarningMessage: Undefined property: Http_request_logger::$load
Filename: hooks/http_request_logger.php
Line Number: 9
错误信息2
An uncaught Exception was encountered
Type: ErrorMessage: 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; } }
错误原因
- 钩子类
Http_request_logger不属于CI框架的控制器/模型体系,没有内置的$load属性,直接使用$this->load会触发未定义属性错误。 - 虽然获取了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
相关产品推荐
相关产品推荐

