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

Symfony+API Platform框架下security_message的翻译实现问题

API Platform security_message 免监听器翻译方案

你之前直接填写翻译键不生效的核心原因是:@UniqueEntity等验证注解的message会由Symfony验证器组件自动触发翻译逻辑,但API Platform 2.6版本的security_message默认仅会将配置的字符串原样传入AccessDeniedException,不会自动调用翻译组件。

无需编写全局异常监听器的更简便实现有两种:

方案1:直接在接口配置中用表达式调用翻译(最简便)

API Platform的security_message原生支持Symfony表达式语言,你可以直接用expr()语法调用容器内的翻译服务,提前完成翻译后再传入异常,配置示例如下:

get:
    security: 'is_granted("ROLE_ROOT")'
    security_message: 'expr(service("translator").trans("access_denied", [], "validators"))'

该方案无需额外编写任何PHP代码,仅修改接口配置即可生效,适合接口数量不多的场景。

方案2:重写API Platform内置SecurityListener(适合全局统一处理)

如果项目接口数量多,不想每个接口都写表达式,可以直接重写API Platform负责权限校验的SecurityListener类,在抛出异常前统一对security_message做翻译:

  • 继承原ApiPlatform\Core\Security\EventListener\SecurityListener类,重写getSecurityMessage方法,在返回前调用翻译组件处理
  • 在服务配置中将原SecurityListener的实现替换为你自定义的类即可

该方案仅需修改一次代码,全局所有接口的security_message都可以直接填写翻译键,和验证器的用法完全一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 17:06:03