Laravel 5.6数组请求验证结果过滤问题咨询
嘿,我来帮你搞清楚Laravel 5.6里数组类型请求数据的验证方案和过滤逻辑,结合实际例子给你讲明白!
数组类型请求的验证与过滤详解
1. 基础数组验证的写法
当请求数据是数组类型时,你需要用**通配符***来匹配数组中的元素,同时要先验证数组本身的合法性。
比如你提交的是一个tags数组(要求必填,且每个元素是字符串):
// 请求示例 $this->post(route('test'), [ 'tags' => ['laravel', 'php', 'web'], 'extra' => '不需要的字段' ]); // 控制器验证 $data = request()->validate([ 'tags' => 'required|array', // 先验证数组本身必填且是数组类型 'tags.*' => 'required|string|max:255' // 匹配数组中每一个元素,验证规则 ]);
2. 嵌套关联数组的验证
如果是多层嵌套的关联数组(比如批量提交用户信息),可以用多层通配符来定位字段:
// 请求示例 $this->post(route('test'), [ 'users' => [ ['name' => 'Alice', 'email' => 'alice@example.com', 'age' => 30], ['name' => 'Bob', 'email' => 'bob@example.com', 'age' => 25] ], 'other' => '无关字段' ]); // 控制器验证 $data = request()->validate([ 'users' => 'required|array|min:1', // 验证数组必填、是数组且至少有一个元素 'users.*.name' => 'required|string', // 每个user的name必填且为字符串 'users.*.email' => 'required|email' // 每个user的email必填且符合邮箱格式 ]);
3. 验证后的结果过滤逻辑
和单个字段的验证逻辑一致:request()->validate()返回的结果只会包含你在验证规则中明确声明的字段(包括数组通配符匹配的字段),未在规则里定义的字段会被自动过滤掉。
拿上面的嵌套数组例子来说,dd($data)会输出:
array:1 [ "users" => array:2 [ 0 => array:2 [ "name" => "Alice" "email" => "alice@example.com" ] 1 => array:2 [ "name" => "Bob" "email" => "bob@example.com" ] ] ]
可以看到:
- 请求中的
age字段(未在验证规则中声明)被过滤掉了 - 请求中的
other无关字段也被过滤掉了 - 只保留了验证规则里定义的
users数组,以及数组内的name和email字段
4. 额外技巧:保留未强制验证的数组字段
如果你想保留数组中某些不需要强制验证的字段(比如可选的age),可以给字段加上nullable或sometimes规则:
$data = request()->validate([ 'users' => 'required|array|min:1', 'users.*.name' => 'required|string', 'users.*.email' => 'required|email', 'users.*.age' => 'nullable|integer' // 可选字段,存在时验证为整数,不存在也不报错 ]);
这时dd($data)就会包含每个user的age字段了。
5. 注意事项
- 验证数组时,一定要先验证数组本身(比如
'users' => 'required|array'),否则如果请求中没有该数组字段,会直接抛出验证错误。 - Laravel 5.6的数组验证逻辑和后续版本(如5.7+)基本一致,这个写法可以通用。
内容的提问来源于stack exchange,提问作者Chin Leung
相关产品推荐
相关产品推荐

