CodeIgniter 4 不支持全局自动加载 Model,推荐使用 Factories 工厂按需加载、在 BaseController 中统一注入常用 Model,或通过服务容器注册为可注入服务;应避免预加载类文件、全局实例化等破坏框架设计的做法。

CodeIgniter 4 不提供传统意义上的“全局自动加载 Model”机制(比如一启动就实例化所有 Model),但可通过工厂(Factories)和依赖注入实现按需、高效、可复用的 Model 加载,避免在每个控制器里重复写 $this->model('UserModel')。
使用 Factories 工厂按需加载
这是 CI4 官方推荐方式,支持单例复用、命名空间识别与路径自动解析:
- 直接调用
Factories::models('UserModel'),会自动在app/Models/下查找UserModel类; - 若类存在且继承自
CodeIgniter\Model,返回已初始化的实例; - 后续相同调用返回同一实例(共享模式),无需手动管理生命周期;
- 支持传入选项数组,例如
Factories::models('UserModel', ['db' => 'custom_db'])来指定数据库组。
在 BaseController 中统一注入常用 Model
适合全站高频使用的 Model(如 SettingModel、MenuModel),避免重复加载逻辑:
- 在
app/Controllers/BaseController.php的构造函数中注入:
<?php
namespace App\Controllers;
use CodeIgniter\Controller;
use CodeIgniter\Config\Factories;
class BaseController extends Controller
{
protected $settingModel;
public function __construct()
{
$this->settingModel = Factories::models('SettingModel');
}
}
?>
- 所有继承
BaseController的控制器都可直接使用$this->settingModel; - 不破坏依赖显式性,也便于单元测试时替换模拟对象。
通过服务容器注册 Model 为可注入服务(进阶)
若希望 Model 像其他服务一样被自动注入(如构造函数参数自动解析),可在 app/Config/Services.php 中扩展:
- 添加静态方法,例如:
public static function userModel($getShared = true)
{
return new \App\Models\UserModel(); // 或用 Factories::models() 封装
}
- 之后在控制器中可这样使用(需启用容器自动注入):
class UserController extends BaseController
{
public function __construct(private UserModel $userModel) {}
}
- 注意:此方式要求项目启用 PHP 8.0+ 属性注入或完整配置了服务容器别名映射。
不推荐的方式:修改自动加载器或强行全局实例化
CI4 的设计哲学强调“按需加载”,以下做法应避免:
- 在
app/Config/Autoload.php的$psr4或$classmap中试图“预加载 Model 类文件”——这仅注册类路径,不创建实例,也无法触发依赖注入; - 在
index.php或Common.php中手动 new Model 实例并赋值到全局变量——破坏作用域、引发并发问题、绕过框架生命周期管理; - 仿照 CI3 写法,在构造函数里调用
$this->load->model()—— CI4 已移除该语法,$this->load不再可用。


















