2014-08-28 114 views
2

我想覆盖Illuminate\Validation\Validator类中的方法(isValidatable)。我通过创建一个扩展验证器的类(在Illuminate之外)来完成此操作,并且仅覆盖了isValidatable方法。Laravel验证器的自定义服务提供程序

我认为这将起作用,除非我不确定如何创建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); 
    } 

} 

这是Laravel默认ValidationServiceProvider:

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

就是这样......

相关问题