Laravel验证延伸不起火

时间:2017-03-01 00:06:55

标签: php laravel validation

我认为我的验证器扩展无效,但我无法理解为什么。

服务提供商。

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'并且没有放弃,我会失败。

为什么我的自定义验证规则不起作用?

1 个答案:

答案 0 :(得分:9)

我在Laravel Validation文档页面的最底部找到了我的解决方案:(https://laravel.com/docs/5.4/validation

  

要使规则在属性为空时运行,规则必须暗示该属性是必需的。创造这样一个隐含的"扩展,使用Validator :: extendImplicit()方法:

通过将方法从extend更改为extendImplicit,我的问题就解决了。

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()
    {
    }

}