Laravel FormRequest Class without Redirect (response json)

Laravel에서 FormRequset 클레스를 만들어 Validate를 할때 유효하지 않은 경우 무조껀 이전 페이지로 Redirect를 시키게 된다.

물론 헤더에 X-Requested-With : XMLHttpRequest 등을 넣어 json으로 응답 받을 수 있지만, 테스트 과정에도 그렇고 아무 제약없이 api를 제공하고 싶을 때 리다이렉트 응답은 꽤나 신경 거슬리게된다.

과거의 Laravel에선 public function response() 를 사용하여 응답을 정해줄 수 있지만 왜인지 5.5 이후로 해당 기능은 삭제되어 이후엔 아래와 같이 사용해야 한다.

<?php
use Illuminate\Http\Exceptions\HttpResponseException;

/**
 * Handle a failed validation attempt.
 *
 * @param  \Illuminate\Contracts\Validation\Validator  $validator
 * @return void
 *
 * @throws \Illuminate\Validation\ValidationException
 */
protected function failedValidation(Validator $validator)
{
    throw new HttpResponseException(response()->json(..., 422));
}

위와같이 HttpResponseException을 던져 사용해야한다. 다만 모든 FormRequest에 사용하기엔 복잡하니 trait를 사용하면 편리하다.

<?php
trait JsonFormRequestResponse
{
    /**
     * @param Validator $validator
     */
    protected function failedValidation(Validator $validator) {
        //write your business logic here otherwise it will give same old JSON response
        throw new HttpResponseException(response()->json($validator->errors(), 422));
    }
}

위와같이 헬퍼 등에 선언하고
인증이 실패할 경우 json으로 응답해줄 FormRequest에

<?php
class StorePost extends FormRequest
{
    
    use JsonFormRequestResponse;

    public function authorize() ...
}

use JsonFormRequestResponse처럼 사용하면 리퀘스트 타입이 ajax(or json)이 아니더라도 응답을 json으로 응답한다.

글의 문제가 있다면 댓글을 달아 주세요.

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.