2017-03-01 92 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() 
    { 
    } 

}