我决定自己回答这个问题。
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;
});
!!}