Валидация в Laravel: Как полностью настроить формат сообщений об ошибках

Источник: «Laravel Validation: How to COMPLETELY Customize Error Message Format?»
В Laravel валидация возвращает ошибку в виде JSON-ответа с сообщениями об ошибке в строгом стандартном формате. Что делать, если вы хотите изменить его на совершенно другую структуру, потому что ваши фронтендеры запрашивают определённые пары ключ-значение?

Структура ошибок валидации 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, в результате чего получилось следующее:

Реализация пользовательского класса исключений

Здесь можно настроить структуру сообщений об ошибках по своему усмотрению.

Дополнительные материалы

Предыдущая Статья

Шпаргалка по TypeScript

Следующая Статья

Основы сетевых технологий