codeigniter 3控制器文件名、类名和url段必须严格匹配:文件名首字母大写(如user.php),类名完全一致(class user),url段全小写(/user);子目录需路由显式声明;构造函数必须调用parent::__construct()。

控制器文件名和类名必须严格匹配,且首字母大写
CodeIgniter 3 要求控制器文件名(不含扩展名)与类名完全一致,且必须首字母大写。比如类 User 必须存为 application/controllers/User.php,而不是 user.php 或 UserController.php。Linux 服务器对大小写敏感,user.php 在开发环境(Windows/macOS)可能侥幸运行,一上生产环境就 404。
常见错误现象:404 Page Not Found,但 index.php/user 能访问,/user 不能——说明路由已生效,但框架找不到对应类。
- 文件名
User.php→ 类名必须是class User extends CI_Controller - 文件名
Api_v1.php→ 类名必须是class Api_v1 extends CI_Controller(下划线允许,但首字母仍需大写) - 不要用
index.php作控制器名:它是保留字,会导致Undefined property: Index::$load错误 - 避免使用 CodeIgniter 保留名称,如
index、default、model、view等(完整列表见官方文档reserved_names)
URL 中的控制器段必须全小写
浏览器访问时,路径中的控制器名必须小写,哪怕类名是 User,URL 也得是 /user/profile,不是 /User/profile 或 /USER/profile。CI3 内部会把 URL 段转成小写再去匹配文件名,所以大小写不一致直接跳过加载。
典型问题:前端 AJAX 请求写成 url: "/User/login",后端却只有 User.php —— 这个请求永远 404,因为框架只找 user.php 文件。
- 路由配置中也必须小写:
$route['admin'] = 'admin/dashboard';,不能写成'Admin/dashboard' - 如果用了自定义路由映射到某个方法,目标控制器名仍要小写:
$route['api/users'] = 'api/users_list'; - 伪静态启用后,
/index.php/user和/user行为一致,但 URL 段规则不变
子目录控制器需显式声明路径
CodeIgniter 3 不支持自动解析子目录,比如想把控制器放 application/controllers/admin/Manager.php,就不能靠 /admin/manager 直接访问——默认加载器找不到它。
必须在 routes.php 中手动注册:
$route['admin/manager'] = 'admin/manager';
同时确保文件路径、类名、URL 三者统一:
- 文件路径:
application/controllers/admin/Manager.php - 类名:
class Manager extends CI_Controller - URL 访问:
/admin/manager(小写) - 注意:子目录名
admin也要小写,且不能和保留名冲突
构造函数缺失导致 $this->load 未初始化
如果控制器里没写 __construct(),或写了但没调用 parent::__construct(),就会报 Undefined property: Xxx::$load。这不是命名问题,但常被误判为路由失败。
正确写法:
class User extends CI_Controller
{
public function __construct()
{
parent::__construct(); // 这一行不能少
}
public function index()
{
$this->load->view('user_list'); // 才能正常使用 $this->load
}
}
- 即使空构造函数也要写
parent::__construct() - 如果用了
__construct()但忘了这行,所有$this->load、$this->input、$this->db都会失效 - 该问题在继承
CI_Controller的任何控制器中都存在,与命名无关,但表现类似 404(页面空白或致命错误)











