我有一个包含5个多选下拉列表的表单。提交时,我正在尝试运行一些验证,以检查是否已检查至少一个项目。
我控制器中的代码;
$input = Request::except('postcode_id'); //all user input from the form
$validator = \Validator::make(
[
$input => 'required'
]
);
if ($validator->fails())
{
print "failed";
}else{
print "passed";
}
我得到的错误是; Illegal offset type
。我想我可能需要做一个自定义验证器,但是如果有更简单的方法,我想先检查一下。
答案 0 :(得分:2)
Validator::make()
的第一个参数是数据,第二个是验证规则数组,它们由输入名称索引。您可以使用required_without_all
来验证至少必须存在一个,但它有点冗长:
$validator = \Validator::make($input, [
'dropdown_1' => 'required_without_all:dropdown_2,dropdown_3,dropdown_4,dropdown_5'
'dropdown_2' => 'required_without_all:dropdown_1,dropdown_3,dropdown_4,dropdown_5'
'dropdown_3' => 'required_without_all:dropdown_1,dropdown_2,dropdown_4,dropdown_5'
'dropdown_4' => 'required_without_all:dropdown_1,dropdown_2,dropdown_4,dropdown_5'
'dropdown_5' => 'required_without_all:dropdown_1,dropdown_2,dropdown_3,dropdown_4'
]);
或者编写一些代码来生成$rules
数组:
$fields = ['dropdown_1', 'dropdown_2', 'dropdown_3', 'dropdown_4', 'dropdown_5'];
$rules = [];
foreach ($fields as $i => $field) {
$rules[$field] = 'required_without_all:' . implode(',', array_except($fields, $i));
}
$validator = \Validator::make($input, $rules);
答案 1 :(得分:0)
您需要在验证器中使用字符串,而不是变量。试试这个。
$validator = \Validator::make(
[
'input' => 'required'
]
);
自定义验证器本身并不太难。我一直在使用它进行数组输入验证。在Laravel 5请求中,我会做类似的事情
public function __construct() {
Validator::extend("pcc", function($attribute, $value, $parameters) {
$rules = [
'container_id' => 'exists:containers,id'
];
foreach ($value as $containerId) {
$data = [
'container_id' => $containerId
];
$validator = Validator::make($data, $rules);
if ($validator->fails()) {
return false;
}
}
return true;
});
}
public function rules() {
return [
'containers' => 'required|pcc',
];
}