codeigniter 4 的自动路由默认不工作,是因为 $routes->setautoroute(false) 是默认值,必须显式调用 $routes->setautoroute(true) 启用;且控制器类名须以 controller 结尾、uri 段需严格匹配命名约定,任一环节错误即导致 404。

自动路由在 CodeIgniter 4 中为什么默认不工作
CodeIgniter 4 的自动路由(AutoRouterImproved)不是开箱即用的“全自动”——它必须显式启用,且受 $routes->setAutoRoute(false) 默认值影响。如果你没在 app/Config/Routes.php 中调用 $routes->setAutoRoute(true),哪怕控制器和方法命名完全合规,请求也会直接 404。
常见错误现象:404 Page Not Found,但控制器文件存在、类名方法名都正确;日志里看不到任何路由匹配记录;index.php 被正常加载,说明不是 .htaccess 或 Web 服务器配置问题。
- 必须在
Routes.php的路由注册块内调用$routes->setAutoRoute(true) - 该设置只对当前
$routes实例生效,不能写在文件顶部或类外 - 若同时定义了手动路由规则,自动路由仍会尝试匹配未被手动规则覆盖的 URI
改进版自动路由如何处理多段参数(如 /user/123/edit)
旧版自动路由(AutoRouter)只支持「控制器/方法」两级结构,遇到 /user/123/edit 这类带额外路径段的请求,会把 123 当作方法名、edit 当作第一个参数,导致方法找不到。
AutoRouterImproved 引入了「默认方法回退」机制:当请求 URI 段数超过控制器可匹配的方法参数上限时,它会自动将多余段作为参数传递给控制器方法,而不是报错。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 例如
User::edit($id, $action)可接收/user/123/edit,其中$id = '123',$action = 'edit' - 若方法只声明一个参数
edit($id),则/user/123/edit会被拒绝,但/user/123仍可匹配 - 该行为依赖 PHP 的反射机制读取方法签名,因此不能用于闭包或动态调用
为什么启用了 AutoRouterImproved 还是 404?检查这三点
最常被忽略的是命名与目录结构的严格对应关系。CI4 的自动路由不是“模糊匹配”,而是按约定逐级查找,任一环节断裂就中断。
- 控制器类名必须以
Controller结尾,且文件名与类名完全一致(如UserController.php→class UserController extends BaseController) - URI 第一段必须匹配控制器名(不含
Controller后缀),大小写敏感;/user匹配UserController,但不匹配userController或UsersController - 方法名必须是
public,不能有private或protected修饰;且不能是 PHP 魔术方法(如__construct)
AutoRouterImproved 和手动路由混用时的优先级陷阱
手动路由规则永远优先于自动路由。但很多人误以为“只要没写具体规则,自动路由就会兜底”,其实不然——如果某条手动规则语法上能匹配 URI(哪怕目标控制器不存在),它就会先触发,然后才报 404,此时错误来源变成控制器加载失败,而非路由未匹配。
典型误导现象:$route['admin'] = 'admin/dashboard'; 存在,但 Admin 控制器实际叫 AdminController;访问 /admin 时抛出 Class 'App\Controllers\admin\dashboard' not found,而不是走自动路由找 AdminController::index()。
- 所有手动路由规则应确保右侧控制器/方法真实存在,否则会掩盖自动路由能力
- 调试时可临时注释全部手动规则,验证自动路由是否本身可用
- CI4.4+ 支持模块化路由前缀(如
$routes->group('api', ...)),这类分组内的规则仍优先于全局自动路由










