spark routes仅列出当前应用中已注册且可被路由解析器识别的http路由规则,不包含中间件逻辑、控制器方法签名或视图路径;输出为静态快照,不反映运行时动态注册的路由。

CodeIgniter 4 的 spark routes 命令能查到什么
它只列出当前应用中已注册的、**可被路由解析器识别的 HTTP 路由规则**,不包含中间件逻辑、控制器方法签名或视图路径。输出是静态快照,不反映运行时动态注册(比如在控制器里调用 service('router') 手动添加的路由)。
spark routes 不会显示未启用的路由组或带条件的路由
如果某段路由被包裹在
$routes->group('admin', ['filter' => 'auth'], function($routes) { ... })
<p>这类结构里,<code>spark routes</code></p> 仍会显示其完整路径(如 /admin/dashboard),但不会标注该路由是否实际生效——前提是:auth 过滤器存在且未被禁用;若过滤器类不存在或配置错误,命令照样输出,但请求时会抛出 RuntimeException: Filter "auth" not found。
常见漏判点:
- 路由定义在未被加载的配置文件中(如自定义的
Routes.php未被$routes->import()引入) - 使用了
if (ENVIRONMENT === 'development')包裹的路由,生产环境执行spark routes就看不到 -
$routes->set404Override()设置的兜底回调不会出现在列表中
输出字段含义和怎么看才不踩坑
典型输出有四列:Method、Route、Controller#Method、Filters。注意:
-
Route列显示的是原始定义字符串,不是最终匹配结果。比如users/(:num)会原样打出,不代表它能匹配/users/123abc - 若
Controller#Method显示为Closure,说明是闭包路由,无法通过route_to()逆向生成 URL,也无命名支持 -
Filters列为空 ≠ 没过滤器,可能是该路由继承了全局 filter(需查app/Config/Filters.php中的$globals配置) - 重复的
Route行可能意味着多次$routes->add()或 import 冲突,得手动 grepapp/Config/Routes.php和子目录
想查“某个 URL 实际走哪条路由”,spark routes 不够用
它只做注册态枚举,不做匹配模拟。要验证 /api/v2/posts?sort=created_at 是否命中 api/(:segment)/(:segment),得靠调试:
- 临时在
app/Config/Routes.php开头加var_dump($routes->getRoutes()); die;看原始数组结构 - 或者用
php spark serve启服务,访问时开启CI_DEBUG = 1,查看日志里的「Matched route」行 - 更准的方式:写个单元测试,用
$request = new \CodeIgniter\HTTP\IncomingRequest(...)+$router->handle($request)手动触发匹配
真正容易被忽略的是:路由优先级完全由定义顺序决定,spark routes 按注册顺序输出,但你看到的“靠前”未必是最终胜出者——因为通配符路由(如 (:any))若写在前面,会吃掉后面所有更具体的规则。











