Laravel 4 Validation – Вложенные индексированные массивы?

У меня есть множество разных вещей …

$foo = []; $foo['stuff']['item'][0]['title' => 'flying_lotus']; $foo['stuff']['item'][1]['title' => 'various_cheeses']; $foo['stuff']['item'][2]['title' => 'the_career_of_vanilla_ice']; $foo['stuff']['item'][3]['title' => 'welsh_cats']; 

Как я могу проверить ключ «title», используя метод Validator в Laravel 4?

Вот что я до сих пор …

 $validator = Validator::make($foo, ['stuff.item.???.title' => 'required']); 

Я полностью смущен индексированным массивом. Любая помощь будет большой.

Solutions Collecting From Web of "Laravel 4 Validation – Вложенные индексированные массивы?"

Следующий ответ для Laravel <= 5.1. Laravel 5.2 представил встроенную проверку массива .


В настоящее время класс Validator не предназначен для итерации по данным массива. Хотя он может проходить через вложенный массив, чтобы найти определенное значение, он ожидает, что это значение будет единственным (обычно string ) значением.

Как я вижу это, у вас есть несколько вариантов:

1: Создайте правила с ключом массива в имени поля.

В основном, что вы делаете уже сейчас, за исключением того, что вам нужно точно определить, сколько значений имеет ваш массив ['stuff']['item'] . Я сделал что-то вроде этого с хорошими результатами:

 $data = [ 'stuff' => [ 'item' => [ ['title' => 'flying_lotus'], ['title' => 'various_cheeses'], ['title' => ''], ['title' => 'welsh_cats'], ] ] ]; $rules = []; for ($i = 0, $c = count($data['stuff']['item']); $i < $c; $i++) { $rules["stuff.item.{$i}.title"] = 'required'; } $v = Validator::make($data, $rules); var_dump($v->passes()); 

2: Создайте собственный метод проверки.

Это позволит вам создать свое собственное правило, в котором вы можете ожидать значение массива и перебирать его по мере необходимости.

Этот метод имеет свои оговорки, в том, что A) у вас не будет сообщений об ошибке определенного значения, так как это будет ошибка для всего массива (например, если вы передаете stuff.item в качестве значения для проверки) и B) вам нужно проверить все возможные значения вашего массива в вашей пользовательской функции (я предполагаю, что у вас будет больше, чем просто title на проверку).

Вы можете создать метод проверки с помощью Validator::extend() или путем полного расширения класса в другом месте.

3: Расширьте класс Validator и замените / родителем соответствующие правила на прием массивов.

Создайте свой собственный расширенный класс Validator и либо выполните пользовательские правила, либо переименуйте существующие, позволяя этим правилам принимать значение массива, если оно происходит. У этого есть некоторые аналогичные предостережения для опции # 2 пользовательского правила, но может быть «лучшей практикой», если вы собираетесь часто проверять повторяющиеся массивы.

Как сказал @Cryode, Laravel в настоящее время не предлагает эту функциональность из коробки. Я создал класс, расширяющий значение Laravel Validator, чтобы добавить метод iterate($attribute, $rules, $messages) .

Он также может перебирать рекурсивно через массивы, чтобы (например), если у вас есть любое количество «книг», каждое из которых может иметь любое количество «цитат», это все равно будет работать, что пример @ Cryode не делает, поэтому это является немного более надежным.

https://github.com/penoonan/laravel-iterable-validator

В дополнение к ответу @Cryode, и для моей проблемы с laravel 5.

моя форма имеет индекс идентификатора базы данных. поэтому поля формы имеют индекс

 $foo['stuff']['item'][8]['title' => 'flying_lotus']; $foo['stuff']['item'][12]['title' => 'various_cheeses']; $foo['stuff']['item'][23]['title' => 'the_career_of_vanilla_ice']; 

я использовал foreach для достижения своей цели

 foreach($request->input()['stuff']['items'] as $key => $value){ $rules["stuff.items.{$key}.title"] = 'required'; } 

и пользовательские сообщения об ошибках

 foreach($request->input()['stuff']['items'] as $key => $value){ $messages["stuff.items.{$key}.title.required"] = 'Each Title is required...'; } 

и утвердить

 Validator::make($request->input(), $rules, $messages);