codeigniter 4.0 是完全重写的版本,不兼容 3.x:入口强制为 public/,目录结构、命名空间、控制器继承(basecontroller)、路由语法(双冒号)、数据库配置(database.php + .env)、模型加载(model() 函数)及错误提示机制均彻底变更。

CodeIgniter 4.0 不是 CodeIgniter 3.x 的简单升级,而是重写——你不能直接替换 vendor 目录或改几行代码就跑起来。所有核心类、目录结构、命名空间、自动加载逻辑都变了,强行迁移会遇到大量 Class not found、Undefined property 或路由不生效的问题。
入口文件和目录结构必须重配
CI 4 的入口不再是 index.php 放在根目录,而是强制走 public/ 子目录作为 Web 根路径。这意味着:
-
public/index.php是唯一允许被 Web 服务器直接访问的 PHP 文件,其他所有代码(app/、system/)必须禁止外部访问 -
app/替代了旧版的application/,且内部不再有controllers/、models/这类小写目录,而是按命名空间组织:如控制器必须放在app/Controllers/,且类需声明namespace App\Controllers; -
system/是框架核心,不可修改;WRITEPATH(默认为writable/)必须可写,否则日志、缓存、session 全挂
控制器继承和方法签名完全不兼容
CI 3 的 CI_Controller 在 CI 4 中已废弃,所有控制器必须继承 BaseController,且构造函数签名、请求响应处理方式全变:
- 旧写法
class Home extends CI_Controller { public function index() { echo 'ok'; } }在 CI 4 中会报Class 'CI_Controller' not found - 新写法必须带命名空间:
namespace App\Controllers; class Home extends BaseController { public function index() { return view('welcome_message'); } } -
return必须显式返回响应(view()、$this->response->setJSON()等),不能再用echo或print_r - 请求对象(
$this->request)和响应对象($this->response)是注入的实例,不是全局超全局变量
数据库配置和模型使用方式彻底重构
CI 4 的数据库层不再是单例 + 全局函数风格,而是基于服务容器 + Query Builder + 实体类的组合:
- 配置从
application/config/database.php移到app/Config/Database.php,且格式为类属性数组:public $default = [ 'DBDriver' => 'MySQLi', 'hostname' => 'localhost', ... ]; - 环境变量优先级更高:如果
.env中写了database.default.hostname=localhost,它会覆盖app/Config/Database.php中的值 - 模型不再靠
$this->load->model()加载,而是直接 new 或通过服务容器获取:$userModel = model('UserModel'); - 实体类(Entity)和模型(Model)分离:模型负责查询逻辑,实体负责数据映射。例如
UserModel继承Model,User继承Entity,两者通过protected $returnType = User::class;关联
路由定义语法和作用域变了
CI 3 的 $route['default_controller'] = 'welcome'; 风格在 CI 4 中失效,所有路由必须在 app/Config/Routes.php 中用闭包或字符串语法注册:
- 基础路由:
$routes->get('/', 'Home::index');—— 注意双冒号,不是斜杠 - 带参数路由:
$routes->get('user/(:num)', 'User::view/$1');,其中$1是捕获组占位符,不是正则变量 - 分组路由支持命名空间:
$routes->group('admin', ['namespace' => 'App\Controllers\Admin'], function($routes){ $routes->get('dashboard', 'Dashboard::index'); }); - 路由文件默认只加载一次,修改后需清空
writable/cache/下的路由缓存,否则新规则不生效
最常被忽略的一点:CI 4 的错误提示默认只在开发环境(CI_ENVIRONMENT = development)下显示完整堆栈,生产环境会静默失败。如果你改完代码发现页面空白,先检查 .env 里是否设了 CI_ENVIRONMENT = production,再看 writable/logs/ 里的最新日志文件。











