Laravel Validation

이하루·2024년 7월 28일
0

Laravel의 유효성 검사(validation)에 대해서 알아보자

✅ Laravel Validation?

Laravel에서의 유효성 검사 작성 위치는 크게 controller와 request class, 두가지로 나눌 수 있다. 각각의 사용방법을 익혀 상황에 맞는 방법을 찾아 사용하면 될 것이다.

1. controller에서 직접 유효성 검사

아래와 같이 유효성 검사가 필요한 메서드의 상단에 $request의 validation 메서드를 사용해 각 항목별 유효성 규칙을 나열한다.
각각의 규칙은 파이프 형식 ('a|b'), 배열형식 (['a','b'])으로 작성이 가능하다.

public function store(Request $request)
{
    $validated = $request->validate([
		// 기본 형식 (에러가 있어도 처음부터 끝까지 검사)
        'title' => 'required|unique:posts|max:255',
        'title' => ['required','unique:posts','max:255'],
        // 에러가 있으면 검사 종료(bail)
		'title' => 'bail|required|unique:posts|max:255',
        // JSON과 같은 중첩 속성에 대한 유효성 체크
		'author.title' => 'required',
		// 필드명에 .이 있을 경우 \로 이스케이프 처리
		'author\.title' => 'required',

    ]);
}

1. Form Request에서 유효성 검사

Laravel에서의 Request는 아래의 artisan 명령어를 통해서 추가할 수 있으며, app\Http\Requests 하위에서 관리된다.

php artisan make:request StorePostRequest

생성된 request파일

class StorePostRequest extends FormRequest
{
    public function authorize()
    {
        return false;
    }

    public function rules()
    {
        return [
        	'타이틀' => 'required|unique:posts|max:255',
        ];
    }

	// 각 필드의 이름을 한국어로 지정 가능
	public function attributes()
  {
      return [
          'title' => '타이틀',
      ];
  }
}

authorize 메서드에서는 Laravel Form에 대한 사용자 인증 및 권한을 체크한다. rule 메서드(유효성 검사) 이전에 실행되며, 기본적으로 접근을 거부(false)하는 처리로 정의된다. 해당 체크가 필요 없을 경우, return true or 메서드를 명시적으로 정의하지 않으면 된다.
rules 메서드 내부에 유효성 검사 항목을 정의하고 return 함으로써 해당 HTTP요청에 대한 유효성 검사를 시행할 수 있다.

✅ Custom Validation

기본적으로 Laravel에서 제공해주는 유효성 검사 항목이 있지만, 상황에 따라서 그에 맞는 유효성 검사 체크 항목이 필요한 경우도 있다. Custom Validation 항목을 만드는 방법에는 크게 두가지가 있는데, service provider의 boot 메서드에 직접 정의, Rule 클래스를 추가하는 방법이다.
이번 글에서는 주로 쓰이는 방법이며 재사용성이 높은 Rule 클래스를 추가하여 Custom Validation을 추가 및 사용방법까지 알아보는 시간을 가져보고자 한다.

⭐ Rule 클래스를 이용한 Custom Validation

Laravel에서의 Rule는 아래의 artisan 명령어를 통해서 추가할 수 있으며, app\Rules 하위에서 관리된다.

php artisan make:rule CustomRule

생성된 rule파일

class CustomRule implements Rule
{
    protected $param;

    public function __construct($param = 5)
    {
    	// 매개변수 넘겨 받을 경우, 지역변수에 할당해 사용 
        $this->param = $param;
    }

    public function passes($attribute, $value)
    {
    	// 다른 필드 값 참조 방법
    	$otherValue = request()->input('other_field'); 

        // 사용자 정의 규칙을 지정 (true:OK, false:NG)
        return $value % 2 == 0; // 짝수 여부 체크
    }

    public function message()
    {
    	// 검사 실패 시, 반환할 오류 메시지 정의
        return 'The :attribute field is required.';
    }
}

request파일에서의 사용예시

use App\Rules\CustomRule;

class StoreExampleRequest extends FormRequest
{
    public function rules()
    {
        return [
            'field1' => ['required', new CustomRule(10)],
            'field2' => ['required', new CustomRule], // 매개변수x
        ];
    }
}
profile
어제보다 더 나은 하루

0개의 댓글