2014-08-28 79 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 
      ); 
     }); 
    } 
} 

就是這樣......

相關問題