Метод after
Метод after класса Validator добавляет колбэк-функцию, которая выполняется после прохождения всех стандартных правил валидации. Первым параметром метод принимает замыкание, которое получает экземпляр валидатора. Внутри замыкания можно добавлять собственные ошибки с помощью метода errors. Метод возвращает текущий экземпляр валидатора, что позволяет строить цепочки вызовов.
Синтаксис
<?php
$validator = Validator::make($data, $rules)->after(function ($validator) {
// Пользовательская логика проверки
if ($validator->errors()->isEmpty()) {
// Добавление собственной ошибки
$validator->errors()->add('field', 'Custom error message');
}
});
?>
Пример
Проверим, что сумма двух полей не превышает заданное значение:
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
use IlluminateSupportFacadesValidator;
class OrderController extends Controller
{
public function store(Request $request)
{
$validator = Validator::make($request->all(), [
'price' => 'required|numeric|min:0',
'tax' => 'required|numeric|min:0',
])->after(function ($validator) use ($request) {
$total = $request->price + $request->tax;
if ($total > 1000) {
$validator->errors()->add('total', 'Total price cannot exceed 1000');
}
});
if ($validator->fails()) {
return response()->json([
'errors' => $validator->errors()
], 422);
}
// Сохранение заказа
}
}
?>
Результат выполнения кода при сумме больше 1000:
{
"errors": {
"total": ["Total price cannot exceed 1000"]
}
}
Пример
Проверим зависимость полей друг от друга - если дата окончания раньше даты начала:
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
use IlluminateSupportFacadesValidator;
class EventController extends Controller
{
public function store(Request $request)
{
$validator = Validator::make($request->all(), [
'start_date' => 'required|date',
'end_date' => 'required|date',
])->after(function ($validator) {
$start = strtotime($validator->getValue('start_date'));
$end = strtotime($validator->getValue('end_date'));
if ($end <= $start) {
$validator->errors()->add('end_date', 'The end date must be after the start date');
}
});
if ($validator->fails()) {
return redirect()->back()->withErrors($validator)->withInput();
}
// Сохранение события
}
}
?>
Результат выполнения кода при некорректных датах:
{
"errors": {
"end_date": ["The end date must be after the start date"]
}
}
Пример
Создадим валидатор с несколькими колбэками после валидации:
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
use IlluminateSupportFacadesValidator;
class UserController extends Controller
{
public function store(Request $request)
{
$validator = Validator::make($request->all(), [
'email' => 'required|email',
'password' => 'required|min:8',
'password_confirmation' => 'required|same:password',
])->after(function ($validator) {
// Проверка на запрещённые домены
$email = $validator->getValue('email');
if (str_ends_with($email, '@tempmail.com')) {
$validator->errors()->add('email', 'Temporary email addresses are not allowed');
}
})->after(function ($validator) {
// Проверка сложности пароля
$password = $validator->getValue('password');
if (!preg_match('/[A-Z]/', $password)) {
$validator->errors()->add('password', 'The password must contain at least one uppercase letter');
}
});
if ($validator->fails()) {
return response()->json([
'errors' => $validator->errors()
], 422);
}
// Создание пользователя
}
}
?>
Результат выполнения кода с ошибками:
{
"errors": {
"email": ["Temporary email addresses are not allowed"],
"password": ["The password must contain at least one uppercase letter"]
}
}