Как получить ошибки из 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()); } |
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); } |
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(); |
$validation = $request->validated(); $errors = $validation->fails();
В errors, может быть массивом или объектом, это не так важно.
P.S использовать в контроллере Validator::make или $request->validate, не очень хотелось бы поскольку дублировать код в контроллеры нет желания.
Дополнительно:
Смотрите на заголовки. В ларавел это работает из коробки. Если запрос ajax - возвращаем 422 и список ошибок, если из формы - редирект обратно.
Все запросы к api должны использовать application/json тогда редиректа не будет
- У меня стоит заголовок Content-Type application/json, на скриншоте он 3 сверху
- Malmind, наверное стоит указать что вы хотите ПРИНИМАТЬ только json через Accept: application/json. Собственно если начать смотреть как Ларка определяет expectsJson - вы на это наткнетесь.
/** * Determine if the current request is asking for JSON. * * @return bool */ public function wantsJson() { $acceptable = $this->getAcceptableContentTypes(); return isset($acceptable[0]) && Str::contains(strtolower($acceptable[0]), ['/json', '+json']); }
/** * Determine if the current request is asking for JSON. * * @return bool */ public function wantsJson() { $acceptable = $this->getAcceptableContentTypes(); return isset($acceptable[0]) && Str::contains(strtolower($acceptable[0]), ['/json', '+json']); }
- Дмитрий, спасибо большое!
- Дмитрий, Можете написать ответ, отмечу его тоже как правильный
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

Для того чтобы получить ошибки из FormRequest в контроллере в Laravel 10, необходимо выполнить несколько шагов.
Во-первых, убедитесь, что у вас есть FormRequest класс, который используется для валидации данных перед их обработкой в контроллере. Этот класс должен содержать правила валидации и сообщения об ошибках.
Пример FormRequest класса:
```php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class MyFormRequest extends FormRequest
{
public function authorize()
{
return true;
}
public function rules()
{
return [
'name' => 'required',
'email' => 'required|email',
];
}
public function messages()
{
return [
'name.required' => 'Please enter your name',
'email.required' => 'Please enter your email',
'email.email' => 'Please enter a valid email address',
];
}
}
```
Затем в вашем контроллере вы можете использовать метод validate() для проверки данных и получения ошибок. Если данные не проходят валидацию, будет сгенерировано исключение ValidationException, которое содержит информацию об ошибках.
Пример контроллера:
```php
namespace App\Http\Controllers;
use App\Http\Requests\MyFormRequest;
use Illuminate\Http\Request;
class MyController extends Controller
{
public function store(MyFormRequest $request)
{
$validatedData = $request->validate();
// Если данные прошли валидацию, продолжаем обработку
return response()->json(['message' => 'Data validated successfully'], 200);
}
}
```
Если вы хотите получить ошибки в контроллере для дальнейшей обработки, вы можете использовать метод $request->errors() или $request->allErrors() для получения массива ошибок.
```php
$errors = $request->errors();
```
Таким образом, вы можете легко получить ошибки из FormRequest в контроллере, чтобы предпринять необходимые действия в случае возникновения ошибок валидации данных.