debug:router 默认不显示参数校验规则,需加 --show-controllers 或查单条路由(如 debug:router api_users_get_item)才能看到 requirements、defaults 等细节;router:match 则可精准反馈校验失败原因。

debug:router 能看到参数校验规则吗
能,但默认不显示。debug:router 输出里只列路径、方法、控制器和是否启用;正则约束(requirements)、默认值(defaults)、选项(options)这些关键校验信息,必须加 --show-controllers 或直接查单条路由。
常见错误现象:改了 @Route("/api/{id}", requirements={"id"="\d+"}),但访问 /api/abc 还是 404,却看不出是不是正则没生效——因为 debug:router api_show 不带 --show-controllers 就压根不打印 requirements。
- 查全部路由并过滤 API:
php bin/console debug:router | grep ^api_ - 查单条路由完整细节(含正则、默认值、HTTP 方法限制):
php bin/console debug:router api_users_get_item - 确认控制器签名和参数绑定是否正确:
php bin/console debug:router api_users_get_item --show-controllers
router:match 怎么验证路径参数是否被拒绝
router:match 是唯一能告诉你「为什么 404」的命令。它不是模拟控制器执行,而是走完 Symfony 路由匹配全过程,包括路径解析、方法检查、requirements 校验、condition 表达式求值——任何一环失败都会明确报错。
使用场景:前端调用 /api/v1/posts/123 返回 404,不确定是路由没定义、方法错(比如用了 POST)、还是 id 不满足 \d+ 正则。
- 基础匹配:
php bin/console router:match /api/v1/posts/123→ 显示命中哪条路由,或提示“无匹配” - 指定方法排除歧义:
php bin/console router:match --method=GET /api/v1/posts/123 - 测试正则失败:
php bin/console router:match /api/v1/posts/abc→ 明确输出 “Parameter 'id' does not match requirements '\d+'” - 带 header 测试 condition:
php bin/console router:match "/api/users" --header="Accept-Version:v2"
为什么 debug:router 看不到 api_* 路由
不是配置写错了,大概率是 API Platform 的主路由根本没加载。Symfony 自身不生成 api_* 前缀的路由,全靠 API Platform 的 config/routes/api_platform.yaml 导入。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
典型表现:运行 debug:router 列表里全是 app_* 和 _wdt,完全没 api_*;但 src/Entity/User.php 确实加了 #[ApiResource]。
- 检查
config/routes/api_platform.yaml是否存在且内容为:api_platform: resource: '%kernel.project_dir%/vendor/api-platform/core/src/Bridge/Symfony/Bundle/Resources/config/routing.yaml' - 确认该文件没被注释、没拼错路径、没放错位置(必须在
config/routes/下) - 清缓存后重试:
php bin/console cache:clear(开发环境可加--env=dev) - 如果用的是旧版 Symfony 2.x,API Platform 可能未兼容,需确认
composer show api-platform/core版本是否 ≥ 2.6
Request 对象里怎么取路由参数而不是 query 参数
别碰 $request->query->get('id'),那是 URL 查询字符串(?id=123);路由参数(/users/{id})存在 $request->attributes 里,这是 Symfony 路由匹配后注入的上下文。
容易踩的坑:在 Controller 方法签名里已经自动注入了 int $id,再手动从 Request 取就是重复劳动,还可能类型错乱(比如 get('id') 返回 string,而你期望 int)。
- 正确方式(推荐):直接声明参数,让 Symfony 自动转换和校验:
public function show(int $id): Response - 手动取路由参数:
$request->attributes->get('id')(返回原始 string,需自行 cast) - 千万别用:
$request->query->get('id')或$_GET['id'],它们和{id}无关 - 调试时快速确认:
dump($request->attributes->all())能看到所有路由参数、_controller、_route 等
路由参数校验不是黑盒,router:match 的错误提示比日志更准,而 debug:router 必须加参数才暴露正则和默认值——这两条命令配合用,90% 的路径匹配问题当场定位。


















