要在 symfony 中实现动态 url 路径解析,必须定义带参数的路由,如 /user/{id},并声明同名方法参数,symfony 自动注入;可添加正则约束、默认值、可选参数(仅限末尾)及主机名匹配。

要在 Symfony 应用中让一个 URL 路径能接收并自动解析变量(比如 /user/123 或 /post/my-first-post),就必须定义带有参数的动态路由,否则所有路径都只能是静态匹配,无法响应不同 ID 或 slug 的请求。
使用 #[Route] 属性定义基础动态参数
在控制器方法上添加 #[Route] 属性,路径中用花括号包裹参数名,如 {id} 或 {slug}:
第一步:在控制器方法签名前写上 #[Route('/user/{id}', name: 'user_show')]
第二步:将同名参数 $id 直接声明为方法形参,类型可选 int 或 string:
public function show(int $id): Response { ... }
这一步无需手动从 Request 对象里 extract,Symfony 会自动把 /user/123 中的 123 解析为整型并注入 $id。若路径为 /user/abc,则因类型不匹配直接返回 404,【不是 500 错误,而是静默失败】。
为参数添加正则约束和默认值
当需要限制参数格式或提供兜底行为时,必须显式配置 requirements 和 defaults:
方法一:用 requirements 限定只接受数字
#[Route('/page/{id}', name: 'page_show', requirements: ['id' => '\d+'])]
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
方法二:同时设置默认值与约束
#[Route('/blog/{slug}', name: 'blog_show', defaults: ['slug' => 'latest'], requirements: ['slug' => '[a-z0-9\-]+'])]
注意:defaults 中的键名必须与路径中占位符名称完全一致,否则该默认值不会生效;requirements 的正则字符串不能带开头 ^ 或结尾 $,Symfony 会自动包裹。
支持多段嵌套参数与可选参数
动态路由可包含多个参数,也可让末尾参数变为可选:
#[Route('/api/{version}/users/{id?}', name: 'api_user_show', defaults: ['id' => null])]
这里 {id?} 表示该段可省略,配合 defaults: ['id' => null] 后,/api/v1/users 和 /api/v1/users/42 都能命中同一路由。但要注意:【可选参数只能出现在路径末尾,且前面不能有固定段】,/user/{id?}/edit 是非法语法,会抛出 RouteCompilerException。
在路由中捕获主机名(多域名场景)
当应用需响应多个域名(如 admin.example.com 和 dashboard.example.org),应把 host 作为动态参数处理:
#[Route(path: '/settings', host: '{domain}', name: 'settings_page', requirements: ['domain' => '(?:admin\.example\.com|dashboard\.example\.org)'])]
此时 {domain} 会被自动注入控制器方法,且仅当 Host 请求头匹配正则时才触发该路由。环境变量中无需硬编码域名,全部交由 requirements 控制。










