Laravel验证阵列选择字段

时间:2017-09-15 11:54:42

标签: laravel validation select

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在基于数组的选择名称方面存在一些问题。

感谢任何帮助!

2 个答案:

答案 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;
}