Метод forEach
Метод forEach класса Rule применяется для создания правил валидации,
которые применяются к каждому элементу массива. Первым параметром
передаётся замыкание, которое получает текущий ключ и значение элемента,
и возвращает массив правил для этого элемента. Этот метод особенно
полезен, когда необходимо валидировать каждый элемент массива
с учётом его позиции или значения.
Синтаксис
<?php
use Illuminate\Validation\Rule;
Rule::forEach($callback);
?>
Пример
Давайте провалидируем массив чисел, чтобы каждый элемент был чётным числом:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
use Illuminate\Support\Facades\Validator;
class NumberController extends Controller
{
public function validate(Request $request)
{
$validator = Validator::make($request->all(), [
'numbers' => [
'required',
'array',
Rule::forEach(function ($value, $key) {
return ['integer', 'min:1', 'max:100'];
}),
],
]);
if ($validator->fails()) {
$res = $validator->errors()->all();
} else {
$res = 'Validation passed';
}
echo $res;
}
}
?>
Пример
Давайте провалидируем массив строк, где каждый элемент должен быть строкой длиной от 2 до 10 символов:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
use Illuminate\Support\Facades\Validator;
class StringController extends Controller
{
public function validate(Request $request)
{
$validator = Validator::make($request->all(), [
'items' => [
'required',
'array',
Rule::forEach(function ($value, $key) {
return ['string', 'min:2', 'max:10'];
}),
],
]);
if ($validator->fails()) {
$res = $validator->errors()->all();
} else {
$res = 'All items are valid';
}
echo $res;
}
}
?>
Результат выполнения кода при передаче массива ['a', 'abcde', 'abcdefghij']:
[
"The items.0 must be at least 2 characters.",
"The items.2 must not be greater than 10 characters."
]
Пример
Давайте провалидируем массив с учётом ключа элемента, где элементы с чётными индексами должны быть чётными числами:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
use Illuminate\Support\Facades\Validator;
class IndexController extends Controller
{
public function validate(Request $request)
{
$validator = Validator::make($request->all(), [
'data' => [
'required',
'array',
Rule::forEach(function ($value, $key) {
$rules = ['integer'];
if ($key % 2 === 0) {
$rules[] = 'even';
} else {
$rules[] = 'odd';
}
return $rules;
}),
],
]);
if ($validator->fails()) {
$res = $validator->errors()->all();
} else {
$res = 'All data is valid';
}
echo $res;
}
}
?>
Результат выполнения кода при передаче массива [2, 3, 4, 5]:
"All data is valid"
Смотрите также
-
метод
when,
который условно применяет правила валидации -
метод
requiredIf,
который делает поле обязательным по условию -
метод
in,
который проверяет вхождение значения в список -
метод
sometimes,
который добавляет правила при выполнении условия