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

Ссылка скопирована
1 ответ

Мне нужно написать 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 со следующими заголовками:

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

Хотелось бы проверять наличие ошибок в контроллере, чтобы можно было написать что-то в этом духе:

$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']); }

  • Дмитрий, спасибо большое!
  • Дмитрий, Можете написать ответ, отмечу его тоже как правильный
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Антон С. Ответ

Для того чтобы получить ошибки из 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 в контроллере, чтобы предпринять необходимые действия в случае возникновения ошибок валидации данных.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно