У меня есть форма с 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
. Я думаю, мне, возможно, понадобится выполнить специальный валидатор, но сначала я хочу проверить, если есть более простой способ.
Первый аргумент 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);
Вам нужно использовать строки в валидаторе, а не в переменных. Попробуйте это вместо этого.
$validator = \Validator::make( [ 'input' => 'required' ] );
Пользовательский валидатор сам по себе не слишком сложный. Я использую его все время для проверки ввода массива. В Laravel 5 Request я сделаю что-то подобное
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', ]; }