2017-03-01 86 views
1

我不認爲我的驗證器擴展正在工作,但我無法理解爲什麼。Laravel驗證擴展不會觸發

服務提供商。

class AppServiceProvider extends ServiceProvider 
{ 
    /** 
    * Bootstrap any application services. 
    * 
    * @return void 
    */ 
    public function boot() 
    { 
     Validator::extend('fail', function ($attribute, $value, $parameters, $validator) { 
      return false; 
     }); 
    } 

    /** 
    * Register any application services. 
    * 
    * @return void 
    */ 
    public function register() 
    { 
    } 

} 

我知道服務提供商的啓動,是因爲發射,如果我dd();引導方法中,我得到的輸出。如果我將dd();添加到擴展閉包函數中,我不會得到任何輸出。

請求

class SaveOrder extends FormRequest 
{ 
    /** 
    * Determine if the user is authorized to make this request. 
    * 
    * @return bool 
    */ 
    public function authorize() 
    { 
     return true; 
    } 

    /** 
    * Get the validation rules that apply to the request. 
    * 
    * @return array 
    */ 
    public function rules() 
    { 
     $rules = [ 
      'customer_id' => 'in:' . Customer::getImplodedCurrentTeamKeys(), 
      'pin' => 'fail' 
     ]; 

     return $rules; 
    } 
} 

我知道這個請求被正確地驗證,因爲如果我改變規則'pin' => 'required'和放不給我得到一個失敗。

爲什麼我的自定義驗證規則不起作用?

+0

這可能是愚蠢的,是'使用Illuminate \ Support \ Facades \ Validator'命名空間添加到'AppServiceProvider'中嗎? –

+0

@Saumini感謝您的回覆和您的建議。是'使用Illuminate \ Support \ Facades \ Validator;'出現在AppServiceProvider的頂部 –

回答

2

,我發現我的解決方案在Laravel驗證文檔頁面的最下方:(https://laravel.com/docs/5.4/validation

對於規則運行,即使屬性爲空,規則必須意味着該屬性是必需的。要創建這樣一個「隱性」的擴展,使用Validator :: extendImplicit()方法:

通過改變方法,從extendextendImplicit,我的問題得到解決。

class AppServiceProvider extends ServiceProvider 
{ 
    /** 
    * Bootstrap any application services. 
    * 
    * @return void 
    */ 
    public function boot() 
    { 
     Validator::extendImplicit('fail', function ($attribute, $value, $parameters, $validator) { 
      return false; 
     }); 
    } 

    /** 
    * Register any application services. 
    * 
    * @return void 
    */ 
    public function register() 
    { 
    } 

}