跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

CodeIgniter框架3.x升级到4.x痛点_CodeIgniter框架版本迁移兼容性处理

CI3升级到CI4是破坏性重写而非兼容升级:需改用Composer安装、Web根目录指向public/、控制器加namespace并继承BaseController、路由改用Routes.php方法注册、数据库等核心机制全部重构。 CI3 到 CI4 不是升级,是重写;直接覆盖
system/
或改
index.php
必然白屏、
Fatal error: Class 'CI_Controller' not found
。 PHP 版本和安装方式必须先对齐 CI4 要求 PHP 7.2.5+(实际建议 7.4+ 或 PHP 8.0+),且不再支持旧版 MySQL 驱动(如
mysql_*
)。用 Composer 安装是主流方式,Web 根目录必须指向
public/
,不是
index.php
所在目录。 检查当前环境:
php -v
php -m | grep -E "(mbstring|json|xml|curl)"
禁用旧扩展(如
php.ini
中注释掉
extension=php_mysql.dll
) 新建项目用
composer create-project codeigniter4/appstarter
,别在原项目上硬改 命名空间和控制器继承关系全变了 CI3 的
CI_Controller
在 CI4 里不存在,所有控制器必须加
namespace App\Controllers;
,并继承
BaseController
。不加命名空间或写错路径,类根本不会被自动加载。 CI3 控制器:
class Welcome extends CI_Controller { ... }
CI4 控制器:
namespace App\Controllers; class Welcome extends BaseController { ... }
模型同理:命名空间为
App\Models
,继承
CodeIgniter\Model
自定义核心类(如
application/core/MY_Controller.php
)要重写为服务提供者,在
app/Config/Services.php
中注册 路由和中间件配置不能照搬,语法和作用域都不同 CI3 的
$route['news/(:any)'] = 'news/view/$1';
在 CI4 里会 404,因为新路由系统不识别这种字符串替换,也不再通过全局数组注册。 CI4 路由文件是
app/Config/Routes.php
,必须用
$routes->get()
$routes->post()
等方法显式声明 参数占位符写法是
{id}
(:num)
,但需配合闭包或控制器方法签名,例如:
$routes->get('news/{id}', 'News::view');
权限校验等逻辑不能塞进控制器构造函数,必须注册中间件类,并在路由中绑定:
$routes->add('admin/*', ['middleware' => 'auth']);
调试模式开启需同时满足两个条件:Web 环境为
development
,且
app/Config/Boot/development.php
被正确加载,否则
ini_set('display_errors', '1')
无效 数据库操作、库加载和自动加载机制彻底重构 CI3 的
$this->load->model()
$this->load->library()
全部失效;CI4 用依赖注入 + 工厂模式管理实例,类名、命名空间、自动加载路径错一个就报
Class not found
。 模型不再用
$this->load->model()
,而是构造函数注入或
$model = model('NewsModel');
第三方库不能放
application/libraries/
后直接
$this->load->library()
,得手动 new 或用工厂:
\CodeIgniter\Config\Factories::libraries('MyLib');
自定义 helper 函数要放进
app/Helpers/
,并按 PSR-4 命名(如
url_helper.php
url_helper
),再在
app/Config/Constants.php
helper()
加载
app/Config/Database.php
的配置格式与 CI3 不同,
hostname
改为
host
username
改为
username
(字段名一致但结构嵌套更深) 最常被忽略的是:CI4 没有“超级对象”,
$this->db
$this->session
这些不是自动挂在控制器上的属性,而是通过服务容器按需解析。一旦命名空间写错、类没注册、或
app/Config/Services.php
中服务定义遗漏,就会静默失败或抛出找不到类的致命错误——连日志都不一定记录清楚。

相关文章