Следующий ответ для 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 пользовательского правила, но может быть «лучшей практикой», если вы собираетесь часто проверять повторяющиеся массивы.
Im умирающие чтобы увидеть ответ на этот вопрос :) Я был doi ng это чрезвычайно беспорядочно .... путем выполнения foreach, затем хранения результата в другом массиве, затем проверки этого массива на наличие ошибок и отображения – KyleK