ci4配置文件必须改为类属性驱动而非数组返回,需适配命名空间、加载时机及校验机制,结构从php数组变为php类。

CodeIgniter 跨版本迁移时,配置文件差异是高频出错点,尤其 CI3 到 CI4 的转变不是简单复制粘贴就能解决的。核心在于:CI3 用数组返回配置,CI4 改为类属性驱动,且加载时机、命名空间、校验机制都变了。
配置文件结构从“PHP 数组”变成“PHP 类”
CI3 的 application/config/database.php 是这样的:
<?php defined('BASEPATH') OR exit('No direct script access allowed');
$config['hostname'] = 'localhost';
$config['username'] = 'root';
// …… 全部是 $config 键值对
CI4 的 app/Config/Database.php 必须是一个类:
<?php namespace App\Config;
use CodeIgniter\Database\ConnectionInterface;
class Database extends \CodeIgniter\Database\Config
{
public $default = [
'DSN' => '',
'hostname' => 'localhost',
'username' => 'root',
// 注意:这里必须是 public 属性,类型要匹配(字符串不能写成数组)
];
}
- 所有配置项必须定义在 public 属性 中,不能用动态变量或函数调用初始化
- 属性名必须与框架约定一致(如
$default、$test),拼写错误或大小写不符直接导致启动失败 - CI4 会做运行时类型校验——比如把
'port' => '3306'写成字符串,而框架期望整型,可能静默失效或报错不明确
配置加载路径和生效条件变了
CI3 靠 $config 全局变量 + load->config() 加载;CI4 依赖 PSR-4 自动加载 + 框架启动时自动实例化 Config 类。
-
app/Config/App.php 控制
$baseURL、$forceGlobalSecureRequests等关键项,漏设会导致静态资源 404 或 HTTPS 强制异常 - 调试模式不仅靠
index.php里的ENVIRONMENT,还必须确保 app/Config/Boot/development.php 被正确加载,否则ini_set('display_errors', '1')不起作用 - 环境专属配置(如数据库密码)应放在 writable/production/database.php 这类可写目录下,避免提交到 Git;CI3 没这个机制,容易误传敏感信息
路由和 URL 相关配置需重写语法
CI3 的 routes.php 是键值映射:
$route['default_controller'] = 'welcome'; $route['product/(:any)'] = 'catalog/product_lookup/$1';
CI4 的 app/Config/Routes.php 是面向对象风格:
$routes->setDefaultNamespace('App\Controllers');
$routes->get('/', 'Home::index'); // 注意是 'Class::method'
$routes->add('product/(:segment)', 'Catalog::product_lookup/$1');
- 控制器必须带命名空间(如
App\Controllers\Home),否则 404 - 参数占位符从
(:any)改为(:segment)、(:num)等更严格的类型标识,旧写法会匹配失败 - 闭包路由、分组路由(
$routes->group())、资源路由($routes->resource())功能增强,但语法不兼容 CI3,不能沿用
第三方库和自定义配置要适配自动加载
CI3 用 $this->load->library('mylib') 手动加载;CI4 要求所有类符合 PSR-4 规范,通过命名空间自动加载。
- 自定义配置类(如 app/Config/MyApi.php)必须声明
namespace App\Config;,且继承\CodeIgniter\Config\BaseConfig - 调用方式从
$this->config->item('api_key')变为config('MyApi')->apiKey(注意驼峰转小写+下划线) - 若保留 CI3 风格的全局配置数组,需封装成服务类并注册进依赖容器,否则无法被控制器或模型安全调用











