debug:router显示当前环境实际加载的路由,若为空则业务路由未注册;需检查routes.yaml导入、Bundle启用、缓存清除及环境变量一致性。

直接用 debug:router 就能查到所有已加载路由,但多数 404 或“找不到控制器”问题,其实不是命令不会用,而是你没确认它是否真在当前环境生效。
查全部路由:先看有没有、再看对不对
运行 php bin/console debug:router 输出的是当前环境(APP_ENV)下实际编译进缓存的路由列表——不是你写的 YAML/注解文件本身,而是 Symfony 解析后注册进路由器的对象。
- 如果输出为空或只有
_wdt、_profiler这类调试路由,说明你的业务路由根本没加载:检查config/routes.yaml是否正确导入了 bundle 路由(如api_platform:行不能缩进、不能加注释) - 加
--show-controllers可看到每个路由绑定的完整方法签名,比如App\Controller\UserController::listAction();若显示???或路径错乱,大概率是控制器类不存在、命名空间写错,或用了 PHP 8+ 的#[Route]但项目还在 Symfony 2/3(不支持属性路由) - 用
| grep ^api_或| grep "/v2"快速过滤,比翻几十行更可靠
查单条路由详情:验证参数、默认值和正则约束
光知道路由存在不够,debug:router 支持按路由名或路径查细节,这对排查“为什么 /user/abc 返回 404”特别有用。
- 查路由名:
php bin/console debug:router api_users_get_item—— 显示path、defaults(如{"_format": "json"})、requirements(如{"id": "\d+"}) - 查路径:
php bin/console debug:router /api/users—— 注意:这会尝试匹配路径,但不校验 HTTP 方法或请求头,结果不如router:match精准 - 若
requirements里写了{"slug": "[a-z0-9-_]+"},而你访问/post/123!,debug:router不报错,但实际请求会 404;这种必须用router:match验证
常见失效原因:缓存、环境、Bundle 启用三连击
命令返回结果“看起来正常”,但浏览器或 API 测试工具仍 404?问题往往不在路由定义本身。
- 缓存没清:改完
routing.yaml后必须运行php bin/console cache:clear --env=dev;prod 环境更要加--no-warmup再手动 warmup,否则旧路由还在用 - 环境变量错位:
.env里APP_ENV=prod但你在 dev 模式下跑命令,或反过来——debug:router总是读当前APP_ENV对应的配置,不跨环境 - SensioFrameworkExtraBundle 未启用:Symfony 2/3 依赖它支持注解路由;检查
AppKernel.php的registerBundles()是否包含new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle()
别把 debug:router 当万能钥匙
它只回答“路由是否注册”,不回答“为什么请求没走这条路”。比如:
- 你写了
@Route("/api/{id}", methods={"GET"}),但用 POST 访问 ——debug:router仍会显示该路由,而router:match --method=POST /api/123才会提示 “Method not allowed” - 路由带 condition 表达式(如
condition="request.headers.get('Accept') matches '/json/'")——debug:router不执行 condition,必须用router:match --header="Accept: application/json"测试 - API Platform 的
#[ApiResource]路由,若实体没加这个属性,或routes.yaml里漏了api_platform:导入,debug:router就压根不会列出任何api_*路由
真正卡住的时候,先跑一遍 debug:router,再立刻补一句 router:match —— 两者差的那几秒,省下的可能是半小时翻配置的时间。


















