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
相关产品推荐
相关产品推荐

