【问题标题】:Laravel Validating Arrays Select fieldsLaravel 验证数组选择字段
【发布时间】:2018-02-24 14:40:21
【问题描述】:

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'

它不会将“未选择”选择框识别为错误......

但如果我将验证规则更新为:

'gender[0]'=>'required'
'gender[1]'=>'required'
'gender[N]'=>'required'

它工作得非常好......(“它工作”,我的意思是它返回一个错误“需要性别字段”)。

所以,显然 Laravel 在基于数组的选择名称方面存在一些问题。

感谢任何帮助!

【问题讨论】:

  • 循环播放!

标签: laravel validation select


【解决方案1】:
public function rules() {
    $rules = [];

    $gender = $this->input('gender');
    foreach ($gender as $index => $item) {
        $rules["gender.{$index}"] = 'required';
    }

    return $rules;
}

【讨论】:

    【解决方案2】:

    我决定自己回答这个问题。

    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]'=&gt;'required' 作品

    'gender.*' =&gt; 'required' 没有

    对于基于数组的选择,例如 &lt;select name=gender[0]&gt;

    如果您考虑一下,这很明显:当禁用第一个选项(占位符)的 POSTING 选择标记时,如我上面的示例所示:

    <option selected="selected" disabled="disabled" hidden="hidden" value="">Gender</option>
    

    $POST 什么都不发送......

    所以如果 Laravel 的验证规则是 'gender[0]'=&gt;'required' Laravel “认为”:“好的,我没有收到 "gender[0]",但我知道确切需要什么("gender[0]",当然)。我必须发送一个错误是因为没有"gender[0]"

    但是如果规则是 'gender.*' =&gt; '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;
    
            });
    !!}
    

    【讨论】:

    • 您在我的第一次搜索中,您确实解决了问题。好工作。谢谢
    • :) 不客气。祝你项目成功:)
    猜你喜欢
    • 2021-05-21
    • 2016-04-15
    • 1970-01-01
    • 2013-03-08
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多