CodeIgniter 4强制控制器类名首字母大写、文件名与类名完全一致、存于app/Controllers/下,且不可通过配置修改;仅支持PSR-4自动加载,不接受小写、驼峰或下划线命名。

CodeIgniter 4 不允许你“修改”控制器的命名规则,而是要求你严格遵守它——控制器类名必须首字母大写、文件名与类名完全一致、存放在 app/Controllers/ 下,且不能通过配置去绕过或自定义这套规则。
控制器类名和文件名必须严格匹配
CI4 依据 PSR-4 自动加载机制查找控制器,它不接受小写类名(如 home)、驼峰(如 userProfile)或下划线(如 user_profile)命名。正确写法只有一种:
- 类文件路径:
app/Controllers/Dashboard.php - 类声明必须是:
namespace App\Controllers; class Dashboard extends BaseController - 访问该控制器时,路由中必须写
'Dashboard::index',不能写'dashboard::index'或'Dashboard/Index'
不能改命名规则,但可以改控制器位置(需同步调整命名空间)
如果你希望把控制器放在别的目录(比如 app/Controllers/Admin/),这不是“改命名规则”,而是扩展命名空间结构:
- 新建文件:
app/Controllers/Admin/Users.php - 类开头声明:
namespace App\Controllers\Admin;(注意末尾有\Admin) - 路由注册写成:
$routes->get('/admin/users', 'Admin\Users::index'); - 确保
app/Config/Autoload.php中的$psr4映射已包含该前缀(默认已有App\→APPPATH,所以子目录自动支持)
别试图关闭大小写敏感或启用旧式自动路由
CI4 默认禁用自动路由($routes->setAutoRoute(false)),即使你手动打开它,也仅支持 App\Controllers\* 下首字母大写的类,并且不处理参数、中间件或命名空间嵌套。它不是“灵活命名”的开关,而是一个受限的开发辅助功能:
- 开启后,
/users/list可能映射到Users::list,但前提是类名为Users、方法为list(小写) -
/users/List或/Users/list仍会失败 - 生产环境强烈建议保持
setAutoRoute(false),全部用显式路由控制
常见错误:你以为在改规则,其实只是没对齐
很多“命名不生效”的问题,根源不是框架限制太死,而是三处没同步:
-
Constants.php 中的
APP_NAMESPACE(如'App') -
控制器文件顶部 的
namespace声明(必须是App\Controllers\...) -
Autoload.php 中的
$psr4映射(必须以App\开头并指向APPPATH)
这三者任意一个不一致,就会报 Class not found——不是命名错了,是加载器根本没找对地方。


















