Laravel可以轻松验证基于数组的表单输入字段
<input name='input_name[0][0]">
<input name='input_name[0][1]">
带
'input_name.* = 'required',
https://laravel.com/docs/5.5/validation#validating-arrays
但是,如何验证基于数组的选择字段?
我有一个表格,其中添加了客户信息,用户必须选择客户的性别,并且可以添加无限数量的客户。
所以我有1位顾客的选择:
<select name="gender[0]">
<option selected="selected" disabled="disabled" hidden="hidden" value="">Gender</option>
<option value="Male">Male</option>
<option value="Female">Female</option></select>
然后
<select name="gender[1]">...
<select name="gender[N]">
当我将规则设置为:
'gender.*' => 'required'
它无法将'unchoosen'选择框识别为错误....
但是如果我将验证规则更新为:
'gender[0]'=>'required'
'gender[1]'=>'required'
'gender[N]'=>'required'
它工作得非常好......(通过“它工作”,我的意思是它返回一个错误“性别字段是必需的”)。
因此,显然Laravel在基于数组的选择名称方面存在一些问题。
感谢任何帮助!
答案 0 :(得分:1)
我决定自己回答这个问题。
1)第一个解决方案是使第一个“占位符”选项不被禁用(在我的情况下,见上文 - 这是因为我使用LaravelCollective并且他们默认使用它):
<select name="gender[0]">
<option selected="selected" hidden="hidden" value="">Gender</option>
<option value="Male">Male</option>
<option value="Female">Female</option></select>
当您从选择的第1个选项中删除“已禁用”时,它会在发布时发送''(而不是通过'禁用'发送任何内容)。所以发送
gender[0] = '';
gender[1] = '';
等...
实际上,如果你有很多gender[N]
(或者其他基于阵列的选择),我认为这是最好的解决方案。
2)第二个解决方案由omadonex提供:
public function rules() {
$rules = [];
$gender = $this->input('gender');
foreach ($gender as $index => $item) {
$rules["gender.{$index}"] = 'required';
}
return $rules;
}
在这种情况下,您将为每个基于数组的选择都有一个单独的规则,它将起作用(请参阅我的topicstarter-post结尾处的原因)。我比第一个更喜欢这个解决方案,因为如果你有很多......你会有很长的“性别”规则列表...
3)我还有为什么'gender[0]'=>'required'
作品
和'gender.*' => 'required'
用于基于数组的选择,例如<select name=gender[0]>
如果您考虑一下这很明显:当POSTING选择标签时,第一个选项(占位符)被禁用,如上例所示:
<option selected="selected" disabled="disabled" hidden="hidden" value="">Gender</option>
$ POST什么都不发送......
因此,如果Laravel的验证规则为'gender[0]'=>'required'
Laravel“认为”:“好的,我没有收到"gender[0]"
,但我知道究竟需要什么("gender[0]"
当然)我必须发错,因为没有"gender[0]"
。
但如果规则是'gender.*' => 'required'
且Laravel没有输入“性别”类型,那么它也不知道究竟需要什么('gender.*'
可能意味着gender[0]
...... gender [12345]
... gender[anything]
)。 Laravel不会发错,因为gender[...]
的数量无穷大,所以他只是省略了它......
PS。如果您使用较新版本的 LaravelCollective表单,则默认情况下会创建占位符“已禁用”。这是一个避免它的宏。
{!!
Form::macro('selectNonDisabled', function($value, $placeholder, $array, $disabled=null, $class=null) {
$select = "<select class='form-control $class' $disabled name='$value'>";
$select .= "<option selected='selected' hidden='hidden' value=''>$placeholder</option>";
foreach ($array as $key => $value) {
$select .= "<option value='$key'>$value</option>";
}
$select .= "</select>";
return $select;
});
!!}
答案 1 :(得分:0)
public function rules() {
$rules = [];
$gender = $this->input('gender');
foreach ($gender as $index => $item) {
$rules["gender.{$index}"] = 'required';
}
return $rules;
}