我决定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;
});
!!}
把它放在一个循环! – Amin