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으로 응답한다.