在表单验证的时候,其实我们会经常遇到处理数组的情况,比如最简单的就是我们在发表一篇文章的时候,就很可能想为这篇文章添加一些标签,这个时候,我们想实现对标签的数组表单验证,该如何实现。
通常的数组表单
通常我们的 tags
前端通常会写成这个样子:
<input name='tags[]' >
然后在后端可以通过多对多的关联来实现这个添加标签的功能,但是其实我们仔细地想:我们添加标签的时候希望达到什么样的效果呢?我觉得有下面两个最简单的:
1.这个标签的 tags[]
是不能为空的。
2.一旦 tags[]
不为空,里面的每一个元素(标签)应该是唯一的。
所以在验证的时候,我们可以这样:
Validator::make($request->all(), [
"tags" => 'required|array',
"tags.*" => 'required|string|distinct|min:3',
]);
这里需要解释一下,第一条 "tags" => 'required|array|min:3',
是表明这是一个不能为空的数组,然后第二条 "tags.*" => 'required|string|distinct|min:3',
就是说:tags
数组里面每个元素我希望是 string
,而且是唯一的 (distinct)
,每个元素最小的长度为 3。
更多的表单
那如果说是下面的这种表单呢?
<input type="text" name="employee[1][name]">
<input type="text" name="employee[1][title]">
注意我们这里的 employee[1]
下面会有不同的字段 name 和 title,这时候我们可以这样,也是利用 * 号:
$this->validate($request, [
'employee.*.name' => 'required|string',
'employee.*.title' => 'string',
]);
这样实现的效果就可以单独验证 name
和 title
,而且你也是可以直接在后面添加更多的表单的,比如:
<input type="text" name="employee[2][name]">
<input type="text" name="employee[2][title]">
<input type="text" name="employee[3][name]">
<input type="text" name="employee[3][title]">
这样的表单,上述的验证依然是有效的。
总结
Laravel 的表单验证其实很强大,基本上覆盖了超过 95% 的应用场景了,所以,用好这些表单验证也是保证数据和应用安全的一个方面。
Happy Hacking