Если вы внимательно ознакомились со своими правилами валидации, в частности:
return [
// ...
'invoices' => 'required|array',
'invoices.id' => 'required|integer', // <---
'invoices.description' => 'string', // <---
'invoices.amount' => 'required|numeric', // <---
'invoices.type' => 'required|string', // <---
];
При такой настройке что-то вроде этого должно пройти проверку (по крайней мере, эту часть):
$invoices = [
'id' => 123,
'description' => 'a description',
'amount' => 123,
'type' => 'a type',
];
но это не то, что вам нужно .. вам действительно нужно проверить массив элементов (массив) с такой структурой:
$invoices = [
[
'id' => 123,
'description' => 'a description',
'amount' => 123,
'type' => 'a type',
],
[
'id' => 345,
'description' => 'another description',
'amount' => 156,
'type' => 'another type',
],
];
Итак ... в чем проблема?
Что ж, перед ключами элементов вам нужно получить доступ к ключу самого элемента , но, учитывая, что эти правила будут применяться к каждому элементу в массиве, который вам нужен для использования подстановочного знака. Как сказано в документации:
Вы также можете проверить каждый элемент массива. Например, чтобы
проверить, что каждое электронное письмо в данном поле ввода массива уникально, вы
может делать следующее:
$validator = Validator::make($request->all(), [
'person.*.email' => 'email|unique:users',
'person.*.first_name' => 'required_with:person.*.last_name',
]);
Аналогично, вы можете использовать символ * при указании вашей проверки
сообщения в ваших языковых файлах, что делает использование одного
сообщение проверки для полей на основе массива:
'custom' => [
'person.*.email' => [
'unique' => 'Each person must have a unique e-mail address',
] ],
Итак, в вашем случае:
return [
// ...
'invoices' => 'required|array',
'invoices.*.id' => 'required|integer', // <---
'invoices.*.description' => 'string', // <---
'invoices.*.amount' => 'required|numeric', // <---
'invoices.*.type' => 'required|string', // <---
];
Ознакомьтесь с разделом Проверочные массивы документации.