질문을 삭제하지 말아주세요.!
 
1
0
-1

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 에서 사용하고 싶습니다.

 

질문이 어렵게 주저리 주저리 작성했네요

고수님들에 도움 부탁드립니다. ^^

    CommentAdd your comment...

    2 answers

    1.  
      2
      1
      0

      원하시는게 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  찾아주세요~ ^^

       

      1. 매그니토

        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();
        }

        감사합니다.

      CommentAdd your comment...
    2.  
      1
      0
      -1

      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 를 사용하지 않고

      1. 안정수

         말씀하신건 일종의 Custom Rule 이라고 생각되는데요. Custom Rule 을 등록해서 사용하시는게 어떠신가요?

        Custom Validation Rule을 사용하시는게 좋아보입니다.

         

        그리고 필요한 경우 서비스 프로바이더에 등록하는게 좋습니다.

        개별적으로 등록해서 클래스가 많아지더라도, reqeust lifecycle 안에서 호출되지 않으면

        instance 를 생성하지 않기 때문입니다. 

         

        또한 컨트롤러의 메소드에서 그냥 Request를 사용하셨다면, Controller Method 에 맞게 개별적으로 생성하시는게 좋습니다.

        아티즌 명령어 php artisan make:request 를 사용하시면 됩니다.

         

        마지막으로 validation rule 중에서는 regex:pattern 도 있으니. 이걸 사용하셔도 됩니다.

      2. 안정수

        패스워드의 경우에는 

        confirmed

        규칙을 사용하시면 편리합니다. 

      3. Junewon Park

        password_not_blank는 required로 대체가 가능할 듯합니다.

      CommentAdd your comment...