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;
...
}