커스텀 검증 규칙이란
Laravel에는 풍부한 내장 검증 규칙이 준비되어 있지만, 애플리케이션 고유의 검증 로직이 필요한 장면도 있습니다. 커스텀 검증 규칙을 사용하면, 재이용 가능한 검증 로직을 클래스나 클로저로서 정의하고, 표준 규칙과 같이 사용할 수 있습니다. 커스텀 규칙을 정의하는 방법은 주로 2가지입니다.- 룰 오브젝트 — 재이용성이 높고, 테스트하기 쉬움
- 클로저 — 한 번만 사용하는 심플한 규칙에 적합
룰 오브젝트
룰 클래스를 생성한다
make:rule Artisan 커맨드로 새로운 룰 클래스를 생성합니다. 생성된 클래스는 app/Rules 디렉토리에 배치됩니다.
ValidationRule 인터페이스를 구현한다
생성된 클래스에validate 메서드를 구현합니다. 이 메서드는 검증 실패 시에 $fail 클로저를 호출합니다.
$fail 클로저에 전달하는 문자열에는 :attribute 플레이스홀더를 사용할 수 있습니다. Laravel이 필드명으로 치환합니다.
룰 오브젝트를 적용한다
룰 오브젝트의 인스턴스를 검증 배열에 전달합니다.rules() 메서드에서도 마찬가지로 사용할 수 있습니다.
번역 키를 사용한 에러 메시지
에러 메시지를 하드코드하는 대신, 번역 키를 사용할 수도 있습니다.lang/ja/validation.php에 메시지를 추가합니다.
여러 에러 메시지를 추가한다
하나의 필드에 여러 에러를 보고하려면,$fail을 여러 번 호출합니다.
클로저 기반의 규칙
애플리케이션 내에서 한 번만 사용하는 심플한 규칙은, 클래스를 만들지 않고 클로저로 정의할 수 있습니다.Implicit 규칙(값이 비어 있어도 실행한다)
기본으로는, 필드가 비거나 존재하지 않는 경우, 커스텀 규칙은 실행되지 않습니다. 빈 값에 대해서도 규칙을 실행하고 싶은 경우에는,--implicit 옵션을 붙여서 클래스를 생성합니다.
ImplicitRule 인터페이스를 구현하고 있습니다. 이 인터페이스 자체는 추가의 메서드를 가지지 않고, Laravel에의 시그널로서 기능합니다.
데이터 접근
DataAwareRule — 폼 전체의 데이터에 접근한다
다른 필드의 값에 기반하여 검증하고 싶은 경우에는,DataAwareRule 인터페이스를 구현합니다. setData 메서드가 검증 개시 전에 자동으로 호출됩니다.
ValidatorAwareRule — 검증기 인스턴스에 접근한다
검증기가 가진 모든 정보(실패한 규칙, 커스텀 메시지 등)에 접근하려면,ValidatorAwareRule 인터페이스를 구현합니다.
실전적인 유스케이스
일본어 문자 체크
전각·반각의 문자 종류를 검증하는 규칙입니다.전화번호 포맷 검증
일본의 전화번호 형식을 검증하는 규칙입니다.테넌트 ID 딸린 유니크 제약
멀티 테넌트 애플리케이션에서 자주 있는, 테넌트 스코프 내에서의 유니크 제약입니다.1
룰 클래스를 작성한다
2
폼 리퀘스트에서 사용한다
3
갱신 시에는 ID를 제외한다
기존 레코드를 갱신하는 경우에는, 자기 자신의 ID를 제외하여 중복 체크합니다.
서비스 프로바이더에서의 룰 등록
Validator::extend()로 룰을 추가한다
Validator::extend()를 사용하면, 문자열 형식('rule_name')으로 커스텀 룰을 사용할 수 있게 됩니다. AppServiceProvider의 boot() 메서드에서 등록합니다.
Validator::extend()로 등록한 룰은 문자열로서 지정할 수 있습니다.
Rule 클래스에 스태틱 메서드로서 추가한다
Rule 파사드에 매크로를 추가함으로써, Rule::myRule()과 같은 유창한 API(Fluent API)를 제공할 수 있습니다.
내부 구현의 상세
Illuminate\Validation\Validator가 커스텀 룰을 호출하는 구조를 봅시다.
검증기 내에서는 validateAttribute()가 각 필드를 처리합니다. 룰이 ValidationRule 인터페이스를 구현하고 있는 경우, validateUsingCustomRule() 메서드가 호출됩니다.
ImplicitRule의 처리는 isImplicit() 메서드로 판단되며, 값이 비어 있는 경우에도 룰의 체크를 실행합니다.
관련 페이지
검증(입문)
컨트롤러나 폼 리퀘스트에서의 표준적인 검증 방법을 확인합니다.