You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在security.yaml中动态引用locales配置多语言免认证路由

可复用locales参数的实现方案

不需要重复维护多份语言列表,后续新增支持语言时仅需修改locales参数一处即可,有两种落地成本极低的方案:

方案1:参数注入拼接正则(适配所有Symfony版本,改造成本最低)

先在参数配置中预生成语言匹配的正则片段,直接在access_control中引用即可,不用每次手动修改正则枚举值:

# services.yaml 中的parameters配置块
parameters:
    locale: 'de'
    locales: ['de', 'en']
    # 拼接为正则的或匹配格式,新增语言时仅需修改上方locales数组,同步更新此处即可
    locales_regex: 'de|en'

之后修改security配置中的access_control规则,直接引用预定义的正则参数:

# security.yaml
access_control:
    - { path: ^/v1/(%locales_regex%)/translation, roles: IS_AUTHENTICATED_ANONYMOUSLY }

如果觉得手动维护locales_regex麻烦,可以借助Symfony的容器编译扩展,在容器加载阶段自动把locales数组implode为竖线分隔的字符串,完全不需要手动同步两个参数。

方案2:通过表达式动态校验(无需维护正则,灵活度最高)

放宽路径的正则匹配规则,通过allow_if配置直接校验请求携带的语言是否在合法locales列表内,完全不需要写语言枚举的正则:

# security.yaml
access_control:
    -
      path: ^/v1/[^/]+/translation
      allow_if: "request.getLocale() in parameter('locales')"
      roles: IS_AUTHENTICATED_ANONYMOUSLY

如果你的路由已经给_locale参数配置了校验规则(要求必须匹配%locales%参数值),甚至可以省略allow_if的判断,因为不合法的locale请求会直接被路由层返回404,不会走到权限校验环节。路由配置参考:

# routes.yaml
v1_translation:
  path: /v1/{_locale}/translation
  controller: App\Controller\TranslationController::get
  requirements:
    _locale: '%locales%' # 直接引用参数做路由合法性校验

注意:Symfony 6.0+版本中已经废弃了IS_AUTHENTICATED_ANONYMOUSLY,替换为PUBLIC_ACCESS即可,逻辑完全一致。

内容的提问来源于stack exchange,提问作者nas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 07:27:38