必须调用parent::__construct(),否则$this->request、$this->session等核心服务为null;.env键名须全大写无空格,路由需显式配置且控制器命名严格匹配,App.php等核心配置类不可删除。

基础配置完成后,真正影响项目稳定性和开发效率的,往往不是大框架,而是几个看似微小、却高频出错的细节。
构造函数里没调 parent::__construct()
这是 CI4 最常被踩的坑。只要重写了控制器的 __construct(),就必须第一行调用 parent::__construct()。否则 $this->request、$this->session、$this->uri 全是 null,后续任何操作都会报错或静默失败。
- 错误写法:在调用父类前就访问
$this->session->get() - 正确顺序:先
parent::__construct(),再初始化自己的逻辑或手动注入服务 - 注意:即使只做日志记录或权限判断,也必须守这个顺序
.env 文件命名和格式不规范
.env 是 CI4 的配置中枢,但它的解析极其严格——不是“能读到就行”,而是“完全匹配才生效”。
- 键名必须全大写且用下划线,
app.baseURL要写成APP_BASEURL - 等号前后不能有空格,
CI_ENVIRONMENT = "development"中的空格会让值变成空字符串 - 数组型配置(如数据库)要用点号路径:
database.default.hostname="127.0.0.1" - 改完记得清空
writable/cache/,否则旧缓存会掩盖新配置
路由匹配失败却不报错
CI4 的路由默认静默失败——找不到匹配时直接走 404,但不会提示你哪条规则没生效。
- 检查
public/.htaccess是否存在且生效(Apache);Nginx 用户需确认try_files配置正确 - 确保控制器文件名首字母大写(
Home.php),类名与文件名一致,且继承Controller - 自定义路由要放在
app/Config/Routes.php的$routes->setAutoRoute(false)之后,避免被自动路由覆盖 - 参数捕获写法要准确:
$routes->get('product/(:num)', 'Product::view/$1'),$1不能漏
配置类删多了或加错了
CI4 按需加载配置类,但有些类是框架内部强依赖的,删掉会直接崩溃。
- 不能删:
App.php、Routes.php、Filters.php—— 缺失会抛ClassNotFoundException - 可以删:像
Email.php、Security.php这类,只要你没调用config('Email')或new Email() - 验证方式:运行
php spark list,如果命令报错或缺失,说明某些配置类被误删或引用异常


















