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 шт):

Автор решения: Romka

Это поведение настраивается в методе failedValidation.

Вам нужно в вашем FormRequest переопределить этот метод, например так:

    protected function failedValidation(Validator $validator): void
    {
        throw new ValidationException($validator->errors()->first());
    }
→ Ссылка
Автор решения: the_alex_mark

Фреймворк сам понимает, при каких условиях ему требуется отдавать ответ в формате 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());
    }
}
→ Ссылка