Валидация Laravel: Как настроить формат сообщений об ошибках
Структура ошибок валидации Laravel по умолчанию обычно выглядит следующим образом:
Но если вам необходимо настроить структуру, то один из способов сделать это глобально — переопределить класс Exception
на свой собственный класс.
Создание нового класса исключений
Выполните следующую команду:
php artisan make:exception CustomValidationException
В результате будет создан новый файл app/Exceptions/CustomValidationException.php
со следующим содержимым:
use Exception;
class CustomValidationException extends Exception
{
//
}
Давайте пока оставим все как есть.
Регистрация нового класса исключений
Далее необходимо сообщить Laravel, что мы хотим вывести наш Exception
вместо стандартного:
app/Exceptions/Handler.php:
// ...
public function register(): void
{
+ $this->renderable(function (ValidationException $exception, $request) {
+ if (!$request->wantsJson()) {
+ return null; // Laravel handles as usual
+ }
+
+ throw CustomValidationException::withMessages(
+ $exception->validator->getMessageBag()->getMessages()
+ );
+ });
$this->reportable(function (Throwable $e) {
//
});
}
Мы указали Laravel выводить наше исключение при возникновении ValidationException
. Мы также проверяем, является ли это API-запросом (желая получить JSON-ответ), и если это не так, то позволяем Laravel обрабатывать его, как обычно, без нашего пользовательского исключения.
Реализация пользовательского класса исключений
Вернёмся к нашему классу CustomValidationException
:
app/Exceptions/CustomValidationException.php:
use Illuminate\Http\JsonResponse;
use Illuminate\Validation\ValidationException;
use Symfony\Component\HttpFoundation\Response;
class CustomValidationException extends ValidationException
{
public function render($request): JsonResponse
{
return new JsonResponse([
// Это массив, который будет возвращён в случае ошибки.
// Вы можете поместить в него все, что захотите.
'message' => 'There were some errors',
'status' => false,
'additionalThings' => 'Some additional things',
'errors' => $this->validator->errors()->getMessages(),
], Response::HTTP_UNPROCESSABLE_ENTITY);
}
}
Здесь мы переопределим метод render()
расширяемого нами класса ValidationException
. Внутри него мы вернём JSON-ответ с нужной структурой массива. В нашем случае, помимо стандартных ошибок, мы добавили ключи status
и additionalThings
, в результате чего получилось следующее:
Здесь можно настроить структуру сообщений об ошибках по своему усмотрению.