Как проверить массив в Laravel?
Я пытаюсь проверить массив POST в Laravel:
$validator = Validator::make($request->all(), [
"name.*" => 'required|distinct|min:3',
"amount.*" => 'required|integer|min:1',
"description.*" => "required|string"
]);
Я посылаю пустой POST и получаю этот if ($validator->fails()) {}
как False
. Это означает, что проверка правильна, но это не так.
Как проверить массив в Laravel? Когда я отправлю форму с помощью input name="name[]"
Ответы
Ответ 1
Символ звездочки (*) означает, что вы хотите проверить VALUES в массиве, а не в самом массиве.
$validator = Validator::make($request->all(), [
"name" => "required|array|min:3",
"name.*" => "required|string|distinct|min:3",
]);
В приведенном выше примере:
- "Имя" должно быть массивом не менее 3-х элементов.
- Значения в массиве "name" должны быть разными (уникальными) строками длиной не менее 3 символов.
РЕДАКТИРОВАТЬ: Начиная с Laravel 5.5 вы можете вызывать метод validate() непосредственно для объекта Request, например так:
$data = $request->validate([
"name" => "required|array|min:3",
"name.*" => "required|string|distinct|min:3",
]);
Ответ 2
У меня есть этот массив в качестве данных моего запроса из таблицы/таблицы данных HTML + Vue.js:
[0] => Array
(
[item_id] => 1
[item_no] => 3123
[size] => 3e
)
[1] => Array
(
[item_id] => 2
[item_no] => 7688
[size] => 5b
)
И используйте это для проверки правильности работы:
$this->validate($request, [
'*.item_id' => 'required|integer',
'*.item_no' => 'required|integer',
'*.size' => 'required|max:191',
]);
Ответ 3
Рекомендуемый способ написания логики проверки и авторизации - поместить эту логику в отдельные классы запросов. Таким образом, код вашего контроллера останется чистым.
вы можете создать класс запроса, выполнив php artisan make:request SomeRequest
в методе Request class rules() определите ваши правила проверки
//SomeRequest.php
public function rules()
{
return [
"name" =>[
'required',
'array', //input must be an array
'min:3'//there must be three members in the array
],
"name.*" => [
'required',
'string',//input must be of type string
'distinct',//members of the array must be unique
'min:3'//each string must have min 3 chars
]
];
}
в своем контроллере напишите свою функцию маршрута следующим образом
public function someFunction(SomeRequest $request)
{
//request is already validated before reaching this point
//your controller logic goes here
}
Класс запроса поставляется с хуками/методами до и после проверки, которые можно настраивать на основе бизнес-логики и особых случаев для изменения нормального поведения класса запроса.
Вы можете создать классы родительского запроса для запросов аналогичного типа, например, для запросов web и api, а затем инкапсулировать некоторую общую логику запросов в эти родительские классы.
Ответ 4
Вам нужно перебрать входной массив и добавить правила для каждого входа, как описано здесь: Loop Over Rules
Вот некоторый код для ya:
$input = Request::all();
$rules = [];
foreach($input['name'] as $key => $val)
{
$rules['name.'.$key] = 'required|distinct|min:3';
}
$rules['amount'] = 'required|integer|min:1';
$rules['description'] = 'required|string';
$validator = Validator::make($input, $rules);
//Now check validation:
if ($validator->fails())
{
/* do something */
}
Ответ 5
Немного более сложные данные, сочетание @Laran и @Nisal Gunawardana ответов
[
{
"foodItemsList":[
{
"id":7,
"price":240,
"quantity":1
},
{
"id":8,
"quantity":1
}],
"price":340,
"customer_id":1
},
{
"foodItemsList":[
{
"id":7,
"quantity":1
},
{
"id":8,
"quantity":1
}],
"customer_id":2
}
]
Правило проверки будет
return [
'*.student_id' => 'required|numeric|exists:customers,id',
'*.foodItemsList.*.id' => 'required|exists:food_items,id',
'*.foodItemsList.*.quantity' => 'required|numeric',
];