РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
656 of 1392 menu

Метод 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"] } }

Смотрите также

  • метод sometimes,
    который добавляет правила валидации при выполнении условия
  • метод fails,
    который проверяет, прошла ли валидация
  • метод errors,
    который возвращает все ошибки валидации
  • метод validated,
    который возвращает отвалидированные данные
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить