2014-08-28 2 views
2

Я хочу переопределить метод (isValidatable) в классе Illuminate\Validation\Validator. Я сделал это, создав класс (вне Illuminate), который расширяет Validator и только переопределяет метод isValidatable.Laravel custom serviceprovider для валидатора

Я думаю, что это сработает, за исключением того, что я не уверен, как создать поставщика услуг для класса Validator (или фактически класса CustomLaravelValidator). Раньше я создавал поставщиков услуг, но, похоже, многое происходит внутри сервиса Validator serviceprovider (Illuminate\Validation\ValidationServiceProvider). Поэтому я не знаю, как должен выглядеть мой пользовательский поставщик услуг для этого класса.

Это мой CustomLaravelValidator класс:

<?php namespace API\Extensions\Core; 

use Illuminate\Validation\Validator; 

class CustomLaravelValidator extends Validator { 

    /** 
    * Determine if the attribute is validatable. 
    * 
    * @param string $rule 
    * @param string $attribute 
    * @param mixed $value 
    * @return bool 
    */ 
    protected function isValidatable($rule, $attribute, $value) 
    { 
     // Validate integers on empty strings as well 
     if($rule == 'IntStrict') 
     { 
      return true; 
     } 
     return $this->presentOrRuleIsImplicit($rule, $attribute, $value) && 
     $this->passesOptionalCheck($attribute); 
    } 

} 

Это значение по умолчанию ValidationServiceProvider от Laravel:

<?php namespace Illuminate\Validation; 

use Illuminate\Support\ServiceProvider; 

class ValidationServiceProvider extends ServiceProvider { 

    /** 
    * Indicates if loading of the provider is deferred. 
    * 
    * @var bool 
    */ 
    protected $defer = true; 

    /** 
    * Register the service provider. 
    * 
    * @return void 
    */ 
    public function register() 
    { 
     $this->registerPresenceVerifier(); 

     $this->app->bindShared('validator', function($app) 
     { 
      $validator = new Factory($app['translator'], $app); 

      // The validation presence verifier is responsible for determining the existence 
      // of values in a given data collection, typically a relational database or 
      // other persistent data stores. And it is used to check for uniqueness. 
      if (isset($app['validation.presence'])) 
      { 
       $validator->setPresenceVerifier($app['validation.presence']); 
      } 

      return $validator; 
     }); 
    } 

    /** 
    * Register the database presence verifier. 
    * 
    * @return void 
    */ 
    protected function registerPresenceVerifier() 
    { 
     $this->app->bindShared('validation.presence', function($app) 
     { 
      return new DatabasePresenceVerifier($app['db']); 
     }); 
    } 

    /** 
    * Get the services provided by the provider. 
    * 
    * @return array 
    */ 
    public function provides() 
    { 
     return array('validator', 'validation.presence'); 
    } 

} 

Может кто-нибудь сказать мне, как мой заказ ServiceProvider должен выглядеть?

ответ

5

Ваш поставщик услуг не должен имитировать поставщика услуг Validator. Вам просто нужно зарегистрировать свой пользовательский валидатор, используя метод resolver на фабрике валидатора.

use API\Extensions\Core\CustomLaravelValidator; 

class CustomValidationServiceProvider extends ServiceProvider { 

    public function boot() 
    { 
     $this->app['validator'] 
      ->resolver(function($translator, $data, $rules, $messages) 
     { 
      return new CustomLaravelValidator(
       $translator, 
       $data, 
       $rules, 
       $messages 
      ); 
     }); 
    } 
} 

Вот это ...