hyperf 通过 @validate 注解对 json 数组批量校验,需启用 validationmiddleware 和 validationexceptionhandler,并用 items.*.field 规则校验每个元素,支持数组式动态规则和中文提示。

Hyperf 对前端传来的 JSON 数组做批量修改校验,核心是用 @Validate 注解配合数组规则写法,并确保校验作用在 body 上——因为 JSON 数组通常通过 POST/PUT 的请求体(application/json)提交。
确认请求体格式与注解生效前提
必须满足三个基础条件,否则校验不触发:
- 控制器方法加了
#[Validate([...])]注解 -
config/autoload/middlewares.php中为 HTTP Server 启用了\Hyperf\Validation\Middleware\ValidationMiddleware::class -
config/autoload/exceptions.php中注册了\Hyperf\Validation\ValidationExceptionHandler::class,否则校验失败会抛 500 而非标准 422
JSON 数组字段的规则写法(关键)
假设前端传的是这样的 JSON:
[{"id":1,"name":"张三","status":"active"},{"id":2,"name":"","status":"draft"}]
后端需将整个数组作为 body 校验,字段名就是数组本身(比如叫 items),规则要体现“数组内每个元素”的结构:
- 先声明
items是必填数组:'items' => 'required|array' - 再用点号语法校验数组每一项:
'items.*.id' => 'required|integer|min:1' 'items.*.name' => 'required|string|min:2|max:20''items.*.status' => 'required|in:active,draft,archived'
注意:不能写成 'items.id' 或漏掉 .*.,否则只校验顶层字段,不进入数组内部。
支持动态或复杂规则的写法
如果需要手机号正则、条件性必填(如 status=active 时 email 必填),必须用数组形式规则:
'items.*.phone' => ['required', 'string', Rule::regex('/^1[3-9]\d{9}$/')]-
'items.*.email' => ['required_if:items.*.status,active', 'email'](注意:Laravel 风格的条件规则在 Hyperf 中可用,但需确保 rule 字符串写法兼容) - 避免混用:
['required|string']是错的,必须拆成['required', 'string']
错误提示本地化(中文)
默认报错是英文,要显示中文需两步:
- 执行
php bin/hyperf.php vendor:publish hyperf/validation发布语言文件 - 编辑
storage/languages/zh_CN/validation.php,补充或修改对应 key,例如:'required_if' => ':attribute 在 :other 为 :value 时必须填写'
这样返回的 422 响应里 message 就是中文了。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!









