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