php artisan route:list 直接列出所有注册路由,默认显示domain、method、uri、name、action五列;需注意环境加载、域名参数、缓存清理及类存在性,支持字段筛选、路径过滤与详细模式。

route:list 命令直接列出所有注册路由
执行 php artisan route:list 就能立刻看到当前应用中所有已注册的路由(包括闭包路由、控制器方法、资源路由等),这是最常用也最直接的方式。它默认按字母顺序排列,显示 domain、method、uri、name、action 五列。
常见错误是没加载完整环境导致部分路由缺失——比如在生产环境未开启调试模式时,某些开发专用路由(如 telescope 或 horizon)不会被注册;或者在多域名部署下漏掉 --domain=xxx 参数,结果只看到默认域名的路由。
- 加
--columns=method,uri,name可自定义显示字段,减少干扰 - 加
--except-vendor排除第三方包注册的路由,聚焦自己写的 - 加
--path=api筛选 URI 包含/api的路由(注意不是前缀匹配,是子串搜索) - 加
--reverse反向排序,方便快速定位末尾的资源路由
route:list 报错 “Class xxx does not exist” 怎么办
这个错误本质是 Laravel 在反射路由对应控制器或中间件类时失败了,不是命令本身的问题。典型场景:控制器文件被误删、命名空间写错、PSR-4 自动加载没刷新、或用了不存在的中间件别名(比如 middleware => ['auth.api'] 但 config/auth.php 里没配 api guard)。
解决思路不是绕过命令,而是让 Laravel 能正常解析这些类:
- 先运行
composer dump-autoload确保类映射最新 - 检查报错中提到的类路径是否真实存在,特别注意大小写(Linux 下敏感)
- 临时注释掉疑似问题的路由组(比如带
middleware或controller的Route::group()),再试route:list - 用
php artisan route:clear清掉缓存的路由文件(尤其在修改了routes/web.php后没清缓存时容易触发)
想在代码里拿到路由列表而不是命令行输出
Laravel 并不提供官方 API 直接导出全部路由为数组,但可以通过容器获取 Illuminate\Routing\Router 实例,再调用其 getRoutes() 方法拿到 Illuminate\Routing\RouteCollection 对象,进而遍历处理。
注意这不是为前端展示设计的,而是用于调试、生成文档或动态权限校验等后端逻辑:
-
$routes = app('router')->getRoutes();返回的是对象集合,需用$routes->getIterator()或$routes->all()遍历 - 每个
Route对象的methods()、uri()、getName()、getActionName()才是有效信息,不要直接dd($route)看大对象 - 若在服务提供者或命令中使用,确保路由已加载完成(比如在
boot()阶段而非register()) - 生产环境慎用——全量遍历路由可能影响性能,尤其路由数超 200 条时
为什么 route:list 不显示带条件的路由(比如 where())
它其实会显示,但条件约束不会出现在默认列中。例如 Route::get('user/{id}', ...)->where('id', '[0-9]+') 的 uri 列仍显示为 user/{id},约束信息被隐藏了。
想确认约束是否存在,有两个办法:
- 加
--verbose参数(Laravel 9.2+ 支持),会额外显示where和middleware列 - 在代码里对单个
Route对象调用$route->wheres属性(数组格式),比如['id' => '[0-9]+'] - 注意:正则约束不影响路由匹配优先级,但会影响
route()辅助函数生成 URL 的行为——如果传入非法值,会抛出UrlGenerationException
真正容易被忽略的是路由缓存和热更新之间的矛盾:开发时反复改 routes/*.php,但忘了 php artisan route:clear,导致 route:list 显示的还是旧路由;而线上又常因没跑 php artisan route:cache 导致每次请求都重新解析路由,拖慢响应。











