Laravel에서 사용자 지정 유효성 검사 규칙을 만드는 방법

Laravel은 요청을 검증하기 위해 추가할 수 있는 풍부한 검증 규칙 세트를 제공합니다. 프레임워크의 좋은 점은 내장 기능을 많이 제공할 뿐만 아니라 기능을 확장하고 하나 이상의 프로젝트에서 사용할 수 있는 고유한 규칙 집합을 구축할 수 있다는 것입니다.

이 튜토리얼에서는 Laravel 9에서 사용자 지정 유효성 검사 규칙을 만드는 방법을 배웁니다.

대부분의 경우 Laravel에서 제공하는 규칙은 모든 사용 사례를 검증하기에 충분하지만 특정 조건에서는 사용자 정의 검증 규칙을 추가해야 할 수도 있습니다. 사용자 정의 규칙을 정의하고 이를 통해 요청을 검증할 수 있는 방법을 자세히 살펴보겠습니다.

양식 요청 만들기

양식 요청 개체에 유효성 검사 규칙을 캡슐화하는 것이 좋습니다.

php artisan make:request UserRequest
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class UserRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array<string, mixed>
     */
    public function rules()
    {
        return [
            'name'=>'required|max:255',
            'email'=>'required|email|unique:users',
            'birth_year'=>'required'
        ];
    }
}

보시다시피 클래스에 이미 존재하는 두 가지 메서드가 있습니다.

  • 권한 부여 방법:  권한 부여 규칙을 정의하는 데 사용됩니다. 이 페이지에 액세스할 수 있는 모든 사용자를 결정하는 데 도움이 될 수 있습니다.
  • 규칙 방법:  유효성 검사 규칙을 추가하는 방법입니다. 이름, 이메일, 생년월일을 확인하고 있습니다.

규칙 클래스 생성

방금 본 것처럼 이름과 이메일이 있는 고객 모델을 만들었습니다. 이제 이러한 필드의 유효성을 검사하는 몇 가지 규칙을 추가하겠습니다. 아래 명령을 실행하여 사용자 지정 규칙을 만들 수 있습니다.

php artisan make:rule BirthYearRule
<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class BirthYearRule implements Rule
{
    /**
     * Create a new rule instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        return $value >= 1990 && $value <= date('Y');
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return "The :attribute must be between 1990 to ".date('Y').".";
    }
}

보시다시피 위의 클래스에서 구현해야 하는 두 가지 기능이 있습니다. 이들은 pass() 및 message()입니다.

유효성 검사 논리 추가

유효성 검사 규칙 클래스를 추가했으면 유효성 검사 논리도 추가하겠습니다. 이 예에서는 출생 연도가 1990년보다 크거나 같고 현재 연도보다 작거나 같다고 가정합니다. 따라서 패스 기능을 업데이트하겠습니다.

/**
* Determine if the validation rule passes.
*
* @param  string  $attribute
* @param  mixed  $value
* @return bool
*/
public function passes($attribute, $value)
{
    return $value >= 1990 && $value <= date('Y');
}

좋은 코딩 방법으로 message() 함수를 업데이트해야 합니다. message() 함수에서 유효성 검사 오류가 발생할 경우 표시될 메시지를 지정합니다.

/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
    return "The :attribute must be between 1990 to ".date('Y').".";
}

양식 요청 클래스에서 유효성 검사 규칙 사용

이제 유효성 검사 규칙을 만들었으므로 위에서 추가한 양식 요청 클래스에 유효성 검사를 추가하겠습니다.

첫 번째 단계는 이 새로 생성된 클래스를 요청 클래스로 가져오는 것입니다. 아래 코드를 사용하여 가져올 수 있습니다.

use App\Rules\BirthYearRule;

이제 클래스를 가져왔으므로 계속해서 rules() 메서드를 업데이트하고 업데이트하겠습니다.

/**
* Get the validation rules that apply to the request.
*
* @return array<string, mixed>
*/
public function rules()
{
    return [
        'name'=>'required|max:255',
        'email'=>'required|email|unique:users',
        'birth_year'=>['required', new BirthYearRule]
    ];
}

보시다시피 이제 이름 규칙 목록에 추가 유효성 검사가 추가되었습니다. BirthYearRule 클래스의 새 인스턴스를 만들고 있습니다. rules() 메서드가 실행되면 BirthYearRule 클래스가 인스턴스화되고 BirthYearRule 클래스의 pass() 메서드를 호출하여 이름을 확인합니다.

컨트롤러에서 유효성 검사 규칙 사용

양식 요청에 규칙을 추가하는 위의 방법은 요청 객체를 생성할 때 유용합니다. 규칙 클래스를 컨트롤러 코드에 직접 추가할 수도 있습니다. 컨트롤러에서 직접 BirthYearRule 클래스를 구현하는 방법을 빠르게 살펴보겠습니다.

다시, 첫 번째 단계는 BirthYearRule을 컨트롤러 클래스로 직접 가져오는 것입니다. 아래 코드를 사용하여 클래스를 직접 가져올 수 있습니다.

use App\Rules\BirthYearRule;

클래스를 가져오면 다음 단계는 유효성 검사 호출을 추가하는 것입니다.

$request->validate([
    'name'=>'required|max:255',
    'email'=>'required|email|unique:users',
    'birth_year'=>['required', new BirthYearRule]
])

요청 유효성 검사 기능에서 볼 수 있듯이 이름 유효성 검사에 새 규칙을 추가했습니다. BirthYearRule 클래스의 새 개체를 만들고 있습니다. 이 호출 중에 BirthYearRule의 새 개체가 생성되고 유효성 검사가 수행됩니다.

클로저를 사용한 사용자 지정 유효성 검사 규칙

명령을 사용하여 사용자 지정 유효성 검사 규칙을 만드는 방법을 살펴보았으므로 make:rule클로저를 사용하여 명령을 만드는 방법을 이해해야 합니다. 유효성 검사 규칙의 개념은 동일하게 유지되며 다른 형식으로 구현될 뿐입니다.

$validator = Validator::make($request->post(),[
    'birth_year'=>[
        'required',
        function($attribute, $value, $fail){
            if($value >= 1990 && $value <= date('Y')){
                $fail("The :attribute must be between 1990 to ".date('Y').".");
            }
        }
    ]
]);

위의 코드에서 볼 수 있듯이 Validator 클래스를 사용하여 직접 규칙을 만들고 있습니다. 그 안의 함수는 속성, 값, 실패의 3가지 값을 얻습니다. 속성은 유효성 검사가 수행되는 필드입니다. 값은 해당 개체의 실제 값에 해당하며 실패는 유효성 검사가 실패하면 실행되는 콜백 메서드입니다.

행복한 코딩!!!

1.55 GEEK