Laravel 表单数组验证

JellyBool

JellyBool

在表单验证的时候,其实我们会经常遇到处理数组的情况,比如最简单的就是我们在发表一篇文章的时候,就很可能想为这篇文章添加一些标签,这个时候,我们想实现对标签的数组表单验证,该如何实现。

通常的数组表单

通常我们的 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',
]);

这样实现的效果就可以单独验证 nametitle,而且你也是可以直接在后面添加更多的表单的,比如:

<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

本文由 JellyBool 创作, 转载和引用遵循 署名-非商业性使用 2.5 中国大陆 进行许可。

共有 3 条评论

ljm5889
修改的评论也不能少于六个字哦!
simver
修改的评论也不能少于六个字哦!
ljm5889 回复 simver
修改的评论也不能少于六个字哦!
linyuyuanldb
修改的评论也不能少于六个字哦!
JellyBool 回复 linyuyuanldb
修改的评论也不能少于六个字哦!