跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

如何解决Hyperf中Validator验证器不自动翻译错误码_配置translation组件

Hyperf 的 Validator 默认不自动翻译错误信息,根本原因是验证器未获取协程 locale;需通过中间件注入 locale 到 CoroutineContext,并绑定协程安全的 Translator 实例,确保验证流程全程使用该实例。 Hyperf 的
Validator
默认不会自动翻译错误信息,即使你已安装
hyperf/translation
,也必须显式触发语言上下文绑定——根本原因不是配置漏了,而是验证器没拿到当前协程的 locale。 验证失败时错误信息仍是英文?检查 validation.php 是否被正确加载 验证器语言文件默认从
storage/languages/{locale}/validation.php
加载,但这个路径和 key 必须严格匹配:
{locale}
必须是小写+下划线格式(如
zh_CN
,不能写成
zh-cn
或
ZH_CN
) 文件里每个错误 message 的 key 要和验证规则名完全一致(如
'required' => ':attribute 为必填项'
) 运行
php bin/hyperf.php vendor:publish hyperf/validation
后,确认文件确实生成在
storage/languages/zh_CN/validation.php
,而非
resources/lang
下(那是 Laravel 的路径) setLocale() 在协程中直接调用会失效 这是最常踩的坑:在控制器里写
$this->app->setLocale('zh_CN')
看似生效,但并发请求下会互相污染。因为
Translator
是单例,而协程共享该实例。 现象:A 用户请求返回中文错误,B 用户紧接着请求却收到英文错误 验证器内部调用
$translator->trans()
时,取的是全局 locale,不是当前请求的 正确做法是把 locale 存进协程上下文,并让验证器使用的
Translator
实例能感知它 让 Validator 自动读取协程 locale 的关键配置 你需要两处联动:中间件注入 locale + 验证器使用协程安全的 translator。 Hyperf 3.1.66 本页面提供企业级 PHP 协程框架 Hyperf 3.1.66 版本的官方源码下载与完整更新日志。重点解析 v3.1.66 版本中新增的 gRPC 多客户端负载均衡支持、Pool 连接池全量刷新、Guzzle 持久化 Cookie 以及数据库 JSON 包含键查询等核心优化特性。 下载 在中间件中解析语言标识并写入上下文:
CoroutineContext::set('locale', $lang)
确保
config/autoload/dependencies.php
中
TranslatorInterface
绑定的是你封装的协程安全类(非默认单例) 验证器类(如
FormRequest
)里不要手动 new Translator,统一走容器注入的实例 如果用
@Validate
注解,需确认
ValidationMiddleware
在中间件链中位于语言解析中间件之后 自定义 ValidationExceptionHandler 时别绕过 translator 很多人重写异常处理器,直接拼接字符串或硬编码提示语,结果又断开了翻译链。 不要用
$exception->validator->errors()->first()
直接取原始 message 应调用
$exception->validator->getTranslator()->trans($key, $replace)
手动翻译 或者更稳妥:在异常处理器里重新构造一个
MessageBag
,用当前 locale 的 translator 格式化每条错误 注意
messages()
方法在
FormRequest
中返回的也是未翻译的数组,需主动过一遍 translator 真正卡住人的从来不是“有没有配 translation”,而是“验证器用的 translator 实例有没有绑定到当前协程”。只要 locale 写进了
CoroutineContext
,且验证流程中所有 translator 调用都经过同一上下文感知实例,翻译就自然生效——其余都是路径、大小写、中间件顺序这些细节问题。

相关文章