ci4中需正确注册并加载模型才能用$this->model_name调用,否则报call to undefined property错误;模型须继承model、类名文件名一致、置于app/models/、首字母大写、命名空间app\models;推荐依赖注入加载;务必设置$allowedfields,否则insert/update/save静默失败。

直接用 $this->model_name 就能调用,但前提是模型已正确注册并加载——否则会报 Call to undefined property 错误。
确认模型类命名与文件位置是否匹配
CI4 对模型的自动加载依赖严格的命名和路径规则:
- 模型类必须继承
CodeIgniter\Model,且类名与文件名一致(如UserModel.php→class UserModel extends Model) - 文件必须放在
app/Models/目录下(不支持子目录嵌套,除非显式配置) - 类名首字母大写,文件名也必须首字母大写;CI4 不接受
user_model.php或User_model.php - 命名空间必须为
App\Models(或你自定义的命名空间,但需在app/Config/Autoload.php中注册)
控制器中加载模型的两种方式
CI4 默认启用自动模型发现(Auto-discovery),但仅限于 app/Models/ 下的类。推荐显式加载以避免歧义:
- 使用
$this->load->model('UserModel'):适用于未启用 Auto-discovery 或需动态加载场景 - 直接实例化属性:
protected $userModel;+ 构造函数中赋值$this->userModel = new UserModel();—— 更轻量,但绕过 CI4 的服务容器管理 - 最常用且推荐的是依赖注入:在控制器构造函数参数中声明
public function __construct(UserModel $userModel),CI4 会自动解析并注入(需确保该模型已注册为服务)
调用模型方法前必须检查 $allowedFields
CI4 模型默认启用字段白名单保护,如果忘记设置 $allowedFields,insert()、update()、save() 全部静默失败(不报错,但数据不入库):
- 在模型类中明确声明可写字段:
protected $allowedFields = ['name', 'email', 'status']; - 若想临时关闭白名单(仅调试用),可设为
protected $allowedFields = ['*'];,但上线前务必改回具体字段 -
find()、findAll()、where()等读取方法不受$allowedFields影响
常见错误:$this->userModel 返回 null 或报 Call to a member function
这通常不是加载失败,而是模型类没被正确识别:
- 检查 PHP 文件末尾是否有 BOM 或多余空格(尤其 Windows 编辑器保存时易引入)
- 确认模型类中没有语法错误(比如漏掉
namespace或extends Model) - 运行
php spark optimize清理类映射缓存,再试;开发阶段可临时关闭 OPCache - 如果用了自定义命名空间(如
App\Models\Users\UserModel),必须在app/Config/Autoload.php的$psr4中添加映射,否则自动加载失效
最常被忽略的一点:CI4.7.2 默认开启严格模式,模型类里任何未声明的属性(比如手误写成 $allowdFields)不会触发警告,但会导致 $allowedFields 实际为空数组,从而所有写操作被拦截——建议打开 error_reporting(E_ALL) 并检查日志中的 Notice 级别提示。











