引言
本文说一个小的知识点,在表单验证中,对数组数据进行验证, 我们需要进行两项,一项是数组本身的验证,一项是数组元素的验证。
学习时间
例如有一个POST请求过来的数据,由3个数组组成,name,amount,description。三个字段的验证需求如下:
- name字段,必填,每个元素唯一,且至少有3个元素
- amount字段,必填,元素要求都是整数,且最少有1个元素
- description字段,必填,元素可有可无,且元素都是字符串。
明确了需求,我们发现上述的验证,laravel内置的规则基本可以解决。只是对于字段是数组,且数组长度满足某些条件的要求,有些苛刻。具体如何实现呢?
laravel表单验证规则中,使用星号,可以匹配数组的元素。那么对于name字段,我们的验证规则是这样的:
代码语言:javascript复制$validator = Validator::make($request->all(), [
"name" => "required|array|min:3",
"name.*" => "required|string|distinct|min:3",
]);
第一步验证name必填,必须为数组,且至少有3个元素;第二步,使用星号匹配所有的数组元素, 必填,字符串类型,唯一性。
那么这样,其他两个字段也很好实现了:
代码语言:javascript复制"amount" => "required|array|min:1",
"amount.*" => "required|integer|min:1",
"description" => "required|array",
"description.*" => "required|string",
前后端分离
对于当下前后端分离的开发模式,前端使用VUE网络请求传递过来的数据,如何验证呢?其实,如果相似的接口,上一节的方式也完全可用。但我们讨论一种更复杂一些的情形,比如表单传递过来的是这样的数组:
代码语言:javascript复制[0] => Array
(
[item_id] => 1
[item_no] => 3123
[size] => 35
)
[1] => Array
(
[item_id] => 2
[item_no] => 7688
[size] => 56
)
这是一个二维数组,二维数组内元素都是相同的键值对。那么在laravel的验证器中,应该如何写呢?
这与指定了字段名的数组不同,这个数组的键是自动编排的数字,所以,我们需要通配键名。验证起来应该这样的:
代码语言:javascript复制$this->validate($request, [
'*.item_id' => 'required|integer',
'*.item_no' => 'required|integer',
'*.size' => 'required|max:191',
]);
这样就是针对所有数组内指定的键的数据进行验证了。
写在最后
本文介绍了两种表单格式的数据的验证,一种是指定字段名的一维数组,一种是二维关联数组的验证, 如果有条件的大家可以看一下框架在这种处理验证规则的处理逻辑代码。
Happy coding :-)
我是@程序员小助手,持续分享编程知识,欢迎关注。