laravel отдать джсон с ошибкой вместо редиректа после валидации FormRequest
есть контроллер с методом
public function foo(FooRequest $request)
{
return "OK"
}
в риквесте правила
public function rules()
{
return [
'id' => ['required', 'numeric', 'exists:partners,id'],
'manager_id' => ['nullable', 'numeric'],
];
}
Если я ввожу не валидный id то он просто редиректит в /. Как мне отключить этот редирект и вывести json с ошибкой?
вывод json уже реализован(чот типа JException(code, exception, errors), нужно только понять как мне вывести его вместо редиректа хз куда
Ответы (2 шт):
Это поведение настраивается в методе failedValidation.
Вам нужно в вашем FormRequest переопределить этот метод, например так:
protected function failedValidation(Validator $validator): void
{
throw new ValidationException($validator->errors()->first());
}
Фреймворк сам понимает, при каких условиях ему требуется отдавать ответ в формате JSON. Вот пример из базового класса Illuminate\Foundation\Exceptions\Handler:
/**
* Determine if the exception handler response should be JSON.
*
* @param Request $request
* @param Throwable $e
* @return bool
*/
protected function shouldReturnJson($request, Throwable $e) {
return $request->expectsJson();
}
/**
* Create a response object from the given validation exception.
*
* @param ValidationException $e
* @param Request $request
* @return Response
*/
protected function convertValidationExceptionToResponse(ValidationException $e, $request) {
if ($e->response)
return $e->response;
return $this->shouldReturnJson($request, $e)
? $this->invalidJson($request, $e)
: $this->invalid($request, $e);
}
При необходимости формат ответа можно изменить переопределив соответствующий метод из того же класса:
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
class Handler extends ExceptionHandler {
/**
* @inheritDoc
*/
public function invalidJson($request, ValidationException $exception) {
return response()->json([ 'result' => false, 'message' => $exception->errors()[0] ], $exception->status);
}
}
Если всё же требуется отдавать только ответ в формате JSON то можно указать сам ответ при выдаче исключения, переопределив метод в классе Illuminate\Foundation\Http\FormRequest.
В этом случае сначала будет проверяться наличие данного ответа (первый пример, метод convertValidationExceptionToResponse).
use Illuminate\Foundation\Http\FormRequest;
class ExampleRequest extends FormRequest {
/**
* @inheritDoc
*/
protected function failedValidation(Validator $validator) {
$response = response()
->json([ 'result' => false, 'message' => $validator->errors()->first() ], 422);
throw (new ValidationException($validator, $response))
->errorBag($this->errorBag)
->redirectTo($this->getRedirectUrl());
}
}