2017-09-15 91 views
0

Laravel容易验证基于阵列的形式输入字段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在基于数组的选择名称方面存在一些问题。

感谢任何帮助!

+0

把它放在一个循环! – Amin

回答

0
public function rules() { 
    $rules = []; 

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

    return $rules; 
} 
0

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

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)。我更比一日少了一个这个解决方案,因为你有“性别”的一个长长的清单,如果你有很多的-rules ...

3)此外,我已经undertood为什么'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[...]不见了,所以他只是省略了它。如果您使用新版本的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; 

     }); 
!!}