Malmind
@Malmind

Как получить ошибки из formRequest Laravel 10 в контроллере?

Мне нужно написать FormRequest в laravel, который собираюсь использовать в двух контроллерах, один возвращает JSON и предназначен для работы через API, другой же возвращает шаблон и нужен для работы с пользователем через графический интерфейс, поэтому мне бы хотелось результат работы formRequest обрабатывать непосредственно в контроллере. Версия Laravel Framework 10.23.1, с ним ещё использую JetStream3.1.
При использовании своего formRequest при наличии ошибок он пытается определить урл для редиректа, как правило это предыдущая страница, а у API запроса её нет, поэтому редирект идёт на главную. Обнаружил что это происходит из-за метода failedValidation, который выбрасывает исключение, в котором и делает редирект:
protected function failedValidation(Validator $validator)
    {
        throw (new ValidationException($validator))
                    ->errorBag($this->errorBag)
                    ->redirectTo($this->getRedirectUrl());
    }

Пытался переопределить этот метод, чтобы избежать не нужного мне редиректа, если написать return $validator, то в контролере окажется $request, их которого не получается получить ошибки валидации (ну по крайней мере у меня не получилось найти такой метод). Нагуглил код который переопределяет этот метод:
protected function failedValidation(Validator $validator)
    {
        if ($this->expectsJson()) {
            $errors = (new ValidationException($validator))->errors();
            throw new HttpResponseException(
                response()->json(['data' => $errors], 422)
            );
        }

        parent::failedValidation($validator);
    }

Его проблема в том что условие сработает если это ajax. Под капотом он смотрит поля класса FormRequest ajax и pjax и проверяет заголовки. Поэтому переписал условие на $this->headers->get('content-type') === "application/json", это сработало, но я не уверен в надёжности такого способа.
Тестирую API запрос через PostMan со следующими заголовками:
650549b9669ec258004598.png
Хотелось бы проверять наличие ошибок в контроллере, чтобы можно было написать что-то в этом духе:
$validation = $request->validated();
$errors = $validation->fails();

В errors, может быть массивом или объектом, это не так важно.
P.S использовать в контроллере Validator::make или $request->validate, не очень хотелось бы поскольку дублировать код в контроллеры нет желания.
  • Вопрос задан
  • 269 просмотров
Решения вопроса 1
@aleksejjjjj
Смотрите на заголовки. В ларавел это работает из коробки. Если запрос ajax - возвращаем 422 и список ошибок, если из формы - редирект обратно.

Все запросы к api должны использовать application/json тогда редиректа не будет
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы