원하시는게 Custom Validator 인가요? Custom Validation Rule 인가요?
https://laravel.kr/docs/5.3/validation#custom-validation-rules
을 참고하시면 Custom (사용자 정의) Rule 을 추가할 수 있습니다.
Custom Validator 를 원하시는 거라면
서비스 프로바이더에서 기존 Laravel 의 Validator 와는 다른 이름으로 바인딩 하시고
Form Request 를 상속받은 특정 Form Request 객체에서는
protected function getValidatorInstance()
{
$factory = $this->container->make(ValidationFactory::class);
if (method_exists($this, 'validator')) {
$validator = $this->container->call([$this, 'validator'], compact('factory'));
} else {
$validator = $factory->make(
$this->validationData(), $this->container->call([$this, 'rules']),
$this->messages(), $this->attributes()
);
}
if (method_exists($this, 'withValidator')) {
$this->withValidator($validator);
}
return $validator;
}
이부분을 오버라이딩 하시면 등록하신 Custom Validator 를 불러올 수 있습니다.
잘 이해안되시면 모던 Pug 슬랙에서 @findstar 찾아주세요~ ^^
FormRequest 를 상속받아서 처리아는게 맞을 것 같네요
아래처럼 구현했는데 맞겠죠? ㅎㅎㅎ
public function getValidatorInstance() { $factory = $this->container->make(ValidationFactory::class); $factory->resolver(function($translator, $data, $rules, $messages){ return new AuthValidator($translator, $data, $rules, $messages); }); return parent::getValidatorInstance(); }
감사합니다.
Class AuthValidator extends Validator{
public functoin validateIdLower() //id관련
public function validatePassowordNotBlank(){} //패스워드 관련
public function validatePasswordSameId(){} //패스원드관련
public function validateNameKorean(){} //이름관련
public function validateNameNotSpecial(){} //이름관련
....
}
//로그인
Class LoginController extends Controller{
public function login(Request $request){
$this→validate($request,[
'id'=>[ 'require','id_lower'],
password= >['password_not_blank', 'password_same_id']
]);
}
}
//회원가입
Class JoinController extends Controller{
public function Join(Request $request){
$this→validate($request,[
'id'=>[ 'require','id_lower'],
'password'= >['password_not_blank', 'password_same_id'],
'name'=>['require','name_not_special']
]);
}
}
이렇게 사용하고 싶네요 ^^
ServiceProvider 를 사용하지 않고
말씀하신건 일종의 Custom Rule 이라고 생각되는데요. Custom Rule 을 등록해서 사용하시는게 어떠신가요?
Custom Validation Rule을 사용하시는게 좋아보입니다.
그리고 필요한 경우 서비스 프로바이더에 등록하는게 좋습니다.
개별적으로 등록해서 클래스가 많아지더라도, reqeust lifecycle 안에서 호출되지 않으면
instance 를 생성하지 않기 때문입니다.
또한 컨트롤러의 메소드에서 그냥 Request를 사용하셨다면, Controller Method 에 맞게 개별적으로 생성하시는게 좋습니다.
아티즌 명령어 php artisan make:request 를 사용하시면 됩니다.
마지막으로 validation rule 중에서는 regex:pattern 도 있으니. 이걸 사용하셔도 됩니다.
패스워드의 경우에는
규칙을 사용하시면 편리합니다.
CustomValidator 관련 질문입니다.
1.ServiceProvider 등록
Validator를 상속받아 CustomValidator 구현하고 ServiceProvider 에 등록하면
Validate를 호출하면 무조건 CustomValidator의 인스턴스를 생성합니다.
규모가 큰경우 필요 없는 여러개의 Validateor 까지 로드되게 됩니다.
예를 들어 회원관리 AuthValidator 를 만들고 블러그용으로 BlogValidator 를 만들어서
ServiceProvider 등록하면
Validate 를 호출하면 AuthValidator ,BlogValidator 2개 인스턴스를 생성합니다.
규모가 커져서 Validator 많아 질수록 문제가 될것 같네요
2. FormRequest 사용
FormRequest 에서 Validate 를 설정하는 부분도 있는데
CustomFormRequest 에 rule 이 바로 적용되어, 상황별로 적용하기 부족합니다.
예로 비밀번호 rule 이 4~5 가지가 있는데
회원가입에도 필요하고, 로그인에도 필요하고 , 비밀번호 변경에도 필요합니다.
회원가입용 JoinFormRequest , 로그인용 LoginFormRequest , 비번변경 PwChagneFormRequest 에
같은 비밀번호 체크용 rule을 각각 선언해야 문제가 있네요
3. 원하는 방식
회원관련에 관련된 AuthValidator 를 만들고 관련한 회원가입,로그인,비밀번호변경 Controller 에서만 사용하고
블로그 관련된 BlogValidator 를 만들고 블로그관련 Controller 에서 사용하고 싶습니다.
질문이 어렵게 주저리 주저리 작성했네요
고수님들에 도움 부탁드립니다. ^^