Мне нужно написать 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 со следующими заголовками:
Хотелось бы проверять наличие ошибок в контроллере, чтобы можно было написать что-то в этом духе:
$validation = $request->validated();
$errors = $validation->fails();
В errors, может быть массивом или объектом, это не так важно.
P.S использовать в контроллере Validator::make или $request->validate, не очень хотелось бы поскольку дублировать код в контроллеры нет желания.