2013-07-31 2 views
9

У меня есть массив различных вещей ...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']; 

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

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

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

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

+0

Im умирающие чтобы увидеть ответ на этот вопрос :) Я был doi ng это чрезвычайно беспорядочно .... путем выполнения foreach, затем хранения результата в другом массиве, затем проверки этого массива на наличие ошибок и отображения – KyleK

ответ

19

Следующий ответ для Laravel < = 5.1. Представлен Laravel 5.2 built-in array validation.


В это время, класс 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 пользовательского правила, но может быть «лучшей практикой», если вы собираетесь часто проверять повторяющиеся массивы.

+0

Спасибо за очень сжатый ответ. У меня было ощущение, что решение не будет доступно «из коробки», но ваш первый метод будет работать нормально. Ура! –

+0

@Cryode, если у меня есть вложенный параметр, я могу сделать это так же, как case1, мне не нужно создавать новое правило, мне просто нужен способ проверки элементов формы. – user269867

2

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

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

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

+0

Испытано ли это с использованием Laravel 5? – robjbrain

+0

Nope. Я фактически отправил запрос на тягу, чтобы объединить его в 4. Тесты все прошли, но в настоящее время находятся в подвешенном состоянии. – patricksayshi

0

В дополнение к @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($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); 
Смежные вопросы