symfony路由动态参数通过{param}显式声明,支持defaults设默认值、requirements用正则约束格式,禁止在路径中使用{_controller};多域名路由需用host匹配而非路径参数。

Symfony 路由参数不是靠“自动猜控制器名”实现的,而是通过显式声明占位符 + 约束 + 默认值来控制 URL 解析行为。关键在于理解 {param} 是路径变量,不是控制器路由开关;_controller 是内部参数,不能当 URL 段用。
动态参数怎么写:用 {xxx} 占位,别写 {_controller}
在路径中写 {id}、{slug} 这类花括号变量,Symfony 才会提取对应值并传给控制器方法:
-
@Route("/product/{id}")→ 方法签名写public function show($id) -
@Route("/blog/{year}/{month}")→ 方法接收$year和$month两个参数 - 不要写
/api/{_controller}—— 这会让 Symfony 去找叫 “product” 的服务或类,而不是调ProductController
怎么设默认值和可选性
参数可以不强制出现在 URL 中,靠 defaults 实现:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
-
@Route("/page/{num}", defaults={"num": 1})→ 访问/page和/page/1效果一样 - 多个默认值写成数组:
defaults={"sort": "asc", "limit": 20} - 注意:YAML 方式也支持,默认值写在路由定义里,例如:
defaults: { page: 1 }
怎么限制参数格式:用 requirements 正则
防止非法输入进入控制器,用 requirements 加正则约束:
-
@Route("/post/{id}", requirements={"id": "\d+"})→ 只匹配纯数字,/post/abc直接 404 -
@Route("/user/{username}", requirements={"username": "[a-zA-Z0-9_]+"})→ 允许字母、数字、下划线 - YAML 写法:
requirements: { id: '\d+' }
多域名或主机级动态路由怎么做
如果要按不同域名分发请求(如 admin.example.com 和 api.example.com),不能靠路径参数,得用 host 匹配:
- 注解写法:
@Route(host="{domain}", requirements={"domain": "admin\.example\.com|api\.example\.com"}) - 更实用的是结合环境变量预定义模式:
PUBLIC_HOST_PATTERN="(?:admin|api)\.example\.com",再在 requirements 中引用 - 注意:host 匹配优先于 path,且必须开启
strict_requirements: true(开发时建议关掉便于调试)










