Laravel Validate fail custom message

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;

    ...
}

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.