Laravel 11如何验证POST请求根节点为对象列表的输入?
Laravel 11 根节点为对象数组的POST请求验证方案
当POST请求的根节点直接是对象数组(如[{"id": 1, "name": "One"}, {"id": 2, "name": "Two"}])时,无需嵌套键名,直接针对数组元素的字段编写验证规则即可:
基础验证写法
使用*.字段名语法遍历数组内的每个对象,指定对应字段的验证规则:
$validated = $request->validate([ // 验证数组中的每个元素必须是包含id和name的数组 '*' => 'required|array:id,name', // 验证每个对象的id字段为必填整数 '*.id' => 'required|integer', // 验证每个对象的name字段为必填字符串 '*.name' => 'required|string|max:255', ]);
复杂场景验证(自定义元素规则)
如果每个数组元素需要更灵活的验证逻辑,可使用Rule::forEach()方法:
use Illuminate\Validation\Rule; $validated = $request->validate([ '*' => Rule::forEach(function ($item, $index) { return [ 'id' => ['required', 'integer', 'exists:your_table,id'], 'name' => ['required', 'string', function ($attribute, $value, $fail) { // 自定义验证逻辑,比如禁止名称包含特殊字符 if (preg_match('/[^a-zA-Z0-9\s]/', $value)) { $fail('名称不能包含特殊字符'); } }], ]; }), ]);
注意事项
- 确保请求的
Content-Type设置为application/json,表单数据格式无法直接传递根节点数组,必须使用JSON请求体。 - 若需要验证数组的长度范围,可直接添加数组层面的规则:
$validated = $request->validate([ '' => 'required|array|min:1|max:10', // 验证根数组的长度 '*.id' => 'required|integer', '*.name' => 'required|string', ]);
内容的提问来源于stack exchange,提问作者ebarbara
相关产品推荐
相关产品推荐

