질문을 삭제하지 말아주세요.!
 
2
1
0
class CustomValidator extends Validator
{
 //added only for test
 public function validateTest($attribute, $value, $parameters)
 {
 return false;
 }
}

 

이렇게  추가 Validate 를 만들고

class ValidateServiceProvider extends ServiceProvider
{
 /**
 * Bootstrap any application services.
 *
 * @return void
 */
 public function boot()
 {
 Validator::resolver( function( $translator, $data, $rules, $messages , $customAttributes) {
 return new \App\CustomValidator( $translator, $data, $rules, $messages, $customAttributes );
 });
 }

 }
}


ServiceProvider 를 만들어서 등록해서 사용하면   

 

'providers' => [
 Illuminate\Auth\VlidateServiceProvider::class,
]

 

test 라는 validator를  사용할수 있습니다.

$this->validate($request,
 [
 'password' => [
 'test',
 ],

 [
 'old_password.test'=>'dfdfd',
 ]);

 

--------------------------------------------------------------------------------------------------------------

여기서  저는  CustomValiator 를   필요한부분에서만  사용하고 싶습니다.?  

위처럼 ServiceProvider 에다 넣어  미리로드 하면  불필요하게 메모리만 잡아 먹는것 같고

CustomValiator::make() 

 

이렇게 사용하고 싶은데요? 어찌해야할지요?

 

Validator 생성자에  $translator  는 뭔지도 모르겠구요?



    CommentAdd your comment...

    2 answers

    1.  
      1
      0
      -1

      비슷한 고민은 했던적이 있습니다.

      Customer Validation을 작성한다는 것은 현재 만들어진 rule이 존재하지 않아서 새로 만들어야할 상황에서 작성하고, Service Provider에 등록하는 것이 맞다고 생각합니다.

      매그니토님이 고민하시는 것은 단일한 FormRequest를 만드시고, CRUD시에 필요한 rule를 선택적으로 적용하시는 것이 좋을 듯합니다.

      아래 링크의 Best Answer에 보면, 하나의 FormRequest에서 HTTP요청에 따른 별개의 rule를 적용하고 있네요.

      https://laracasts.com/discuss/channels/requests/laravel-5-validation-request-how-to-handle-validation-on-update

      public function rules()
      {
          $user = User::find($this->users);
      
          switch($this->method())
          {
              case 'GET':
              case 'DELETE':
              {
                  return [];
              }
              case 'POST':
              {
                  return [
                      'user.name.first' => 'required',
                      'user.name.last'  => 'required',
                      'user.email'      => 'required|email|unique:users,email',
                      'user.password'   => 'required|confirmed',
                  ];
              }
              case 'PUT':
              case 'PATCH':
              {
                  return [
                      'user.name.first' => 'required',
                      'user.name.last'  => 'required',
                      'user.email'      => 'required|email|unique:users,email,'.$user->id,
                      'user.password'   => 'required|confirmed',
                  ];
              }
              default:break;
          }
      }

       

      부득이하게 Customer Validation 클래스를 사용해야 한다면 단일 FromRequest의 생성자에서 ValidationFactory를 사용해보시는 것도 한 방법일 듯합니다. (참조: http://stackoverflow.com/a/31418854)

      // Custom Validation 
      namespace App\Validation
      
      use Symfony\Component\Translation\TranslatorInterface;
      use Illuminate\Validation\Validator
      class CustomValidator extends Validator
      {
      
          public function __construct(TranslatorInterface $translator, array $data = [], array $rules = [], array $messages = [], array $customAttributes = [])
          {
              parent::__construct($translator, $data, $rules, $messages, $customAttributes);
          }
          //added only for test
          public function validateTest($attribute, $value, $parameters)
          {
              return false;
          }
      }
       
      // FormRequest
      use App\Validation\CustomValidator;
      use Illuminate\Validation\Factory as ValidationFactory;
      
      class UpdateMyUserRequest extends FormRequest {
      
          public function __construct(ValidationFactory $validationFactory)
          {
      
              $validationFactory->extend(
                  'test',
                  CustomValidator@validateTest,
                  'Sorry, it failed foo validation!'
              );
      
          }
      
          public function rules()
          {
              return [
                  'username' => 'test',
              ];
          }
      }

      위 참조의 본문에서는 Closure를 사용했지만 Laravel문서에는 class와 method만 전달해도 된다고 나와 있네요.(https://laravel.com/docs/5.3/validation#custom-validation-rules)
       CustomValidator의 생성자는  위와 같이 해주셔야 "Unresolvable dependency resolving [Parameter ..." 에러를 막을 수 있습니다. 


      References:

      1. https://laracasts.com/discuss/channels/requests/laravel-5-validation-request-how-to-handle-validation-on-update
      2. http://stackoverflow.com/a/31418854
      3. https://www.sitepoint.com/data-validation-laravel-right-way-custom-validators/
      4. https://www.sitepoint.com/data-validation-laravel-right-way/
        CommentAdd your comment...
      1.  
        1
        0
        -1

        Form Request를 만들고, rules() 메서드 안에서 이렇게 한 번 시도해 보시겠어요? 스택오버플로에서 된다는 데, 진짜로 되면 여기 다시 글 남겨 주세요.

         

        public function rules() {
            \Validator::extend('test', function($attribute, $value, $parameters) {...});
        }
        1. 매그니토

          FormRequest 를 만들어서 사용하면   해당 rules 이 전부 전용되기 때문에

          Controller@method 마다  FormRequest 를  만들어줘야 하네요

           

          회원가입,수정, 비밀번호변경등  회원관련 AuthValidator 를 만들어서    필요한 rule만 골라서 쓰고 싶은데 

          방법이 없을까요?

          (ServiceProvider 에 등록하면  서비스 전체적용이 되고,  FormRequest 적용하면  Controller@method 에  제한되고 ㅜㅜ)

           

        2. 김주원

          하시고자 하는 바를 정확히 이해했는지 모르겠는데, sometimes 라는 룰이 있습니다. 

          https://laravel.kr/docs/5.3/validation#conditionally-adding-rules

        CommentAdd your comment...