CodeIgniter 3 迁移至 CI4 需结构级重构:控制器须声明命名空间并继承 BaseController,改用 return view();入口指向 public/;配置转为类属性;路由改用 Fluent 风格;模型推荐服务类封装。

CodeIgniter 3 老项目迁移到 CI4,不是简单替换文件,而是结构级重构。核心在于打破“照搬习惯”,主动适配 PSR-4、命名空间和分层设计。下面从几个关键接口层面讲清楚必须改、容易错、常忽略的地方。
控制器写法和入口逻辑必须重写
CI3 的控制器继承 CI_Controller,用 $this->load->view() 渲染;CI4 完全废弃这套机制。
- 控制器必须声明命名空间,例如
namespace AppControllers; - 必须继承
BaseController(不是CI_Controller),且该类已内置常用服务如request、response、session - 返回视图不再调用
load->view(),而是直接return view('home/index'); -
index.php不再是唯一入口——Web 服务器根目录必须指向public/,否则会暴露app/和system/目录,触发安全警告
配置文件从数组变成类属性
CI3 的 application/config/database.php 是 return 数组;CI4 的配置是 PHP 类,字段是 public 属性,类型和位置都更严格。
- 数据库配置路径变为
app/Config/Database.php,需定义public $default = [ ... ]; - 错误示例:
'hostname' => 'localhost'写成'hostname' => ['localhost']或漏掉$default属性,会导致启动失败且报错不明确 - 全局配置如
baseURL放在app/Config/App.php的public $baseURL = 'http://localhost:8080/';,缺了它,静态资源 404 - 环境配置不再靠
index.php切换,而是通过.env文件或app/Config/Boot/development.php加载
路由定义方式彻底改变
CI3 的 routes.php 是数组映射;CI4 使用 Fluent 风格的路由对象,支持分组、中间件绑定和命名路由。
- 旧写法
$route['home'] = 'welcome/index';→ 新写法$routes->get('home', 'Home::index'); - 控制器方法必须是 public,且完整类名+方法名格式:
Home::index(对应AppControllersHome::index()) - 带参数的路由要显式声明,例如
$routes->get('user/(:num)', 'User::show/$1');,不能依赖隐式参数顺序 - 默认路由
$routes->setDefaultNamespace('AppControllers\');必须设置,否则找不到控制器
模型和数据库操作需按新规范重写
CI3 的 CI_Model 和 $this->db 在 CI4 中仍可用,但官方推荐转向 Query Builder + 独立服务类,为后续解耦打基础。
- 若继续用 DB 类,
$this->db->get()等语法保留,但需先在控制器中获取实例:$db = ConfigDatabase::connect(); - 更推荐封装成服务类,例如
AppServicesUserService,用构造函数注入ConnectionInterface或直接调用db_connect() - 查询结果默认是
stdClass对象,不是 CI3 的数组;如需数组,加->getResultArray() - 事务控制语法一致,但要注意
$db->transStart()后必须显式$db->transComplete(),否则不生效


















