直接绑定域名需用host属性配合requirements或监听器,否则多域名下url生成出错、路由不稳;host必须带占位符并配正则约束,且需在kernel.request事件中提前注入domain或_locale值确保一致性。

直接绑定域名,用 host 属性就行,但必须配合 requirements 或监听器,否则多域名场景下 URL 生成会出错、路由匹配不稳。
host 属性必须带占位符才能复用多个域名
硬写死 host: "example.com" 只能匹配一个域名;要支持 service.example.com 和 service.another-brand.tld,得用占位符 + 正则约束:
-
host: "{domain}"捕获整个 Host 头值 -
requirements: ['domain' => '%app.public_hostnames_service_pattern%']限定只匹配预设的正则表达式,比如(?:service\.example\.com|service\.another-brand\.tld) - 别漏掉
.env.local里定义该参数:PUBLIC_HOSTNAMES_SERVICE_PATTERN=(?:service\.example\.com|service\.another-brand\.tld) - 移除
defaults中的domain,否则会覆盖实际请求的 Host,导致生成 URL 时固定回默认值
URL 生成时 domain 参数必须显式传入或动态补全
调用 $this->generateUrl('app_service_homepage', ['domain' => 'service.example.com']) 才能正确输出带域名的链接;否则会报错或 fallback 到空 host。更稳妥的做法是加个 RequestListener 在路由前自动塞进当前请求的 domain 值:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 监听
kernel.request事件,在RouterListener之前执行 - 从
$request->getHost()取值,校验是否匹配该上下文的正则模式 - 用
$request->attributes->set('domain', $host)注入,后续路由匹配和 URL 生成都能直接用 - 注册服务时设优先级高于 32(
RouterListener默认是 32),例如priority: 33
子域名做语言路由时 host 要和 _locale 绑定
像 zh.example.com 这类场景,不能只靠 host: "{_locale}.example.com",还得确保 locale 实际生效:
-
requirements: ['_locale' => 'zh|en|fr']防止非法子域名绕过 - 必须在
kernel.request监听器里调用$request->setLocale($locale),否则翻译、表单、验证都还是默认 locale - 路由生成时若不传
_locale,generateUrl()会 fallback 到default_locale配置,而不是当前请求的 host 值 - Twig 模板中别写死
url('homepage', {'_locale': 'zh'}),改用url('homepage', {'_locale': app.request.locale})
真正麻烦的不是匹配,而是 URL 生成时 domain 或 _locale 参数的来源一致性——它既不能依赖配置默认值,也不能每次手动传,得靠监听器在请求生命周期早期就“钉死”那个值。










