Laravel에선 Vaildator 혹은 FormReqeust를 이용해 사용자의 입력값을 검증 할 수 있다.
또한 각 조건 별로 에러 표시되는 에러 메시지를 설정할 수 있는데 해당 부분은 coustom-error-message 을 참고하도록 하자.
TL;DR
use Illuminate\Contracts\Validation\Validator; use Illuminate\Http\Exceptions\HttpResponseException; trait UsesCustomErrorMessage { /** * Handle a failed validation attempt. * * @param \Illuminate\Contracts\Validation\Validator $validator * @return void * * @throws \Illuminate\Http\Exceptions\HttpResponseException */ protected function failedValidation(Validator $validator) { $message = (method_exists($this, 'message')) ? $this->container->call([$this, 'message']) : __('validation.error_message'); throw new HttpResponseException( response() ->json([ 'errors' => $validator->errors(), 'message' => $message, ], 422) ); } }
이 포스트의 목적은 커스텀 에러 메시지가 아니고,
Laravel 5.5이후 부터 입력값 검증에 실패할 경우 아래와 같은 형식으로 에러가 표시되는데,
{ "message": "The given data was invalid.", "errors": { "field-1": [ "Error 1", "Error 2" ], "field-2": [ "Error 1", "Error 2" ], } }
저 "message": "The given data was invalid"
는 FormReqeust의 messages()
나 resources/lang/xx/validation.php
에서는 커스텀이 되지 않아 저 부분을 수정하는 방법에 대해서 말하고자 한다.
위에 에러 메시지를 커스텀 하는 방법은 failedValidation
메소드를 사용해 커스텀 할 수 있다.
protected function failedValidation(Validator $validator) { $message = (method_exists($this, 'message')) ? $this->container->call([$this, 'message']) : '커스텀 에러 메시지'; throw new HttpResponseException( response() ->json([ 'errors' => $validator->errors(), 'message' => $message, ], 422) ); }
이 코드를 FormRequset마다 넣어주면 좋겠지만, 코드가 복잡해지니 helper에 trait 로 선언해두고 use 를 사용해 필요한 곳에 넣어 주면 사용하기 편리하다.
App/helper.php
namespace App\Helpers; use Illuminate\Contracts\Validation\Validator; use Illuminate\Http\Exceptions\HttpResponseException; trait UsesCustomErrorMessage { protected function failedValidation(Validator $validator) { $message = (method_exists($this, 'message')) ? $this->container->call([$this, 'message']) : __('validation.error_message'); throw new HttpResponseException( response() ->json([ 'errors' => $validator->errors(), 'message' => $message, ], 422) ); } }
App/Http/requests/storePost.php (FormRequest)
namespace App\Http\Requests; class storePost extends FormRequest { use UsesCustomErrorMessage; ... }