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

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