Model类不能通过Autoload.php的$libraries或$helpers自动加载;正确方式是用model()辅助函数、构造函数绑定或依赖注入,且必须继承CodeIgniter\Model并确保PSR-4路径正确。
类在 CodeIgniter 4 中
不能通过的或配置项自动加载
——这是最常被误解的一点。CI4 的模型设计为按需实例化,框架不提供“全局自动加载所有模型”的机制,强行配置反而会报错或失效。
里加
名字没用
中的
和
只负责
类文件的自动定位与包含
(即 PHP 的
行为),不是“自动 new 实例”。
数组只对
管理的库生效(如
、
),
不在此列。
如果你在
里写
,启动时会抛出
,因为 CI 会默认去
下找,而非
。
正确初始化模型的三种方式
直接在控制器中用
辅助函数:
它会自动检测命名空间、调用
,并注入数据库连接(如果继承了
)。
在控制器构造函数中提前绑定:
这样后续方法可直接用
。
使用依赖注入(仅限继承
的控制器):
前提是该模型已注册进
(默认已支持),且路由未禁用 DI。
容易踩的坑
模型类没继承
:会导致
返回的对象没有
、
等方法,只是个空壳。
命名空间路径不匹配:例如类声明为
,但
中
写成了
(大小写敏感,Linux 下直接失败)。
手动
而不传 DB 实例:会触发
,因为基类的
属性未初始化。
在
构造函数中调用
后赋给
,但子类同名属性会覆盖它(PHP 属性不继承),导致子类里访问不到。
CI4 的模型加载逻辑依赖于
工厂和 PSR-4 自动加载协同工作。跳过工厂直接 new,或试图用旧版 CI3 的 autoload 思路套用,都会卡在实例化或依赖注入环节。真正要“省事”,就老实用
—— 它内部已处理命名空间解析、DB 注入、单例复用,比手动管理更可靠。
ModelAutoload.php$libraries$helpersAutoload.phpmodelapp/Config/Autoload.php$psr4$classmapspl_autoload_register$librariesServicessessiondatabaseModel$libraries'UserModel'Class 'App\Libraries\UserModel' not foundApp\Libraries\App\Models\model()$users = model('UserModel'); // 返回已实例化的 UserModel 对象Services::model()CodeIgniter\Modelprotected $users;public function __construct()
{
$this->users = model('UserModel');
}$this->users->find()CodeIgniter\Controllerpublic function index(UserModel $userModel)
{
$data = $userModel->findAll();
}ServicesCodeIgniter\Modelmodel()find()insert()namespace App\Models;Autoload.php$psr4['App'] = APPPATH . 'Models/';APPPATH . 'models/'new UserModel()Call to a member function query() on null$dbBaseControllermodel()$this->modelServices::model()model('XxxModel')