ci4必须用composer安装且web根目录指向public/,配置、路由、控制器、命名空间等均与ci3不兼容,需严格遵循psr-4和新类结构。

CI4 的安装方式和入口结构完全不同
CodeIgniter 4 不是“解压即用”,它必须通过 composer create-project 安装,且 Web 服务器根目录必须指向 public/ 目录,否则会直接暴露 app/、system/ 等敏感路径。CI3 可以随便放,index.php 在哪,网站根目录就能设在哪。
- CI4 正确安装命令:
composer create-project codeigniter4/appstarter myproject - Apache/Nginx 配置必须让域名解析到
myproject/public/,不是项目根目录 - 如果仍把根目录设在项目根,访问时会报错:
Whoops! We seem to have hit a snag. Please try again later…—— 这不是代码错,是路径错 - CI3 的
application/和system/合并在一个目录里;CI4 拆成app/(你写)、system/(框架核心)、public/(仅入口和静态资源)三层
命名空间和控制器写法不兼容
CI3 的 $this->load->view() 和继承 CI_Controller 在 CI4 中完全失效,强行照搬会报 Class 'CI_Controller' not found 或 Call to undefined method。
- CI4 控制器必须声明命名空间:
namespace App\Controllers; - 必须继承
BaseController,不是CI_Controller - 返回视图不再用
load->view(),而是return view('welcome_message'); - 所有自定义类(如服务类、库)都得加命名空间,且要符合 PSR-4 自动加载规则,否则
new MyService()会找不到类
配置文件从数组变成类属性
CI3 的 application/config/database.php 是个 return 数组的 PHP 文件;CI4 的 app/Config/Database.php 是个类,配置项是 public 属性,改错位置或类型(比如把字符串写成数组)会导致启动失败,但错误提示可能很隐晦。
- 数据库配置现在是:
public $default = [ 'DSN' => '', 'hostname' => 'localhost', ... ]; - 路由配置从
application/config/routes.php移到app/Config/Routes.php,语法也变了:$routes->get('home', 'Home::index'); - 开启调试模式不能只改
index.php,还要确保app/Config/Boot/development.php被加载,否则ini_set('display_errors', '1')不生效 - CI3 的
$config['base_url']在 CI4 中由App.php的public $baseURL = 'http://localhost:8080/';控制,漏设会导致 CSS/JS 404
路由定义更灵活但也更容易配错
CI4 支持闭包路由、路由组、resource() 快捷注册,看着方便,但新手常因大小写、命名空间路径或参数占位符写法出问题,导致 404 却查不到原因。
- 闭包路由示例:
$routes->add('ping', function() { return 'pong'; });—— 注意不是function() { echo 'pong'; },必须 return 字符串 - RESTful 路由:
$routes->resource('users');会自动绑定 5 个标准方法,对应控制器必须是App\Controllers\Users,且方法名严格为listAll()、show($id)等 - 参数占位符从 CI3 的
(:any)改为(:segment)、(:num),写成(:id)会直接忽略匹配 - 路由顺序很重要:越具体的路由要越靠前,否则
$routes->get('(:any)', 'Pages::view');可能吞掉所有其他路由
最常被跳过的其实是环境切换逻辑——CI4 默认用 .env 文件控制环境,但很多人复制完项目就忘了改 CI_ENVIRONMENT = development,结果调试信息全关了,连 Whoops! 错误都不显示。这比语法错误还难排查。










