2016-05-15 71 views
1

我控制器上我有:条件验证

public function store(ProductRequest $request) 

请求:

class ProductRequest extends Request 
{ 
    public function rules() 
    { 
     return [ 
      'name' => 'required|min:3', 
      'perTypeTime' => 'sometimes|required', 
      'per_type_id' => 'required' 
     ]; 
    } 
} 

我想改变上述perTypeTime规则取决于如果per_type_id场是有条件的== 1.

如果我在控制器中启动验证程序,我相信我可以执行以下操作:

$v = Validator::make($data, [ 
    'per_type_id' => 'required|email' 
]); 

$v->sometimes('perTypeTime', 'required|max:500', function($input) 
{ 
    return $input->per_type_id == 1; 
}); 

有没有办法做到这一点,同时保持我的自定义请求。我喜欢这种方法如何保持控制器清洁。

我似乎无法访问请求对象上的验证器。有没有一种方法可以在请求本身内指定这个条件,或者从请求对象访问验证器,或者有另一种方法吗?

回答

2

你可以做到这一点

我想改变上述perTypeTime规则取决于你的ProductRequest如果per_type_id场== 1

rules()方法中是有条件的。 详情请参阅required_if:其他字段,值Laravel documentation validation rules

public function rules() 
{ 
    return [ 
     'name'   => 'required|min:3', 
     'perTypeTime' => 'required_if:per_type_id,1', 
     'per_type_id' => 'required' 
    ]; 
} 
+0

这种方法是罚款这一特定使用案例,但它并没有解决的根源问题:如果我有一个非常特殊的验证,比如'userIsAGoat()',那么该怎么办? – Noir

3

Laravel 5.3,在你的请求文件,您可以添加:

use Illuminate\Validation\Factory; 

...

public function validator(Factory $factory) 
{ 
    $validator = $factory->make($this->input(), $this->rules()); 
    $validator->sometimes('your_sometimes_field', 'your_validation_rule', function($input) { 
     return $input->your_sometimes_field !== null; 
    }); 
    return $validator; 
} 
+0

覆盖验证器功能。这是我正在寻找的,谢谢。 – suarsenegger

+0

此解决方案自[Laravel 5](https://github.com/laravel/framework/blob/5.0/src/Illuminate/Foundation/Http/FormRequest。php#L75),所以它也适用于5.3之前的版本。 – mauricius

0

其实这个答案https://stackoverflow.com/a/41842050/3922975是不是最好的。 我们不必用我们自己的替换默认验证器(因为我们没有改变任何东西)。在那个解决方案中,我们希望验证工厂总是只需要两个属性($ this-> input(),$ this-> rules()),即使在编写时也是如此。

这是Laravel使用默认的验证:

$factory->make(
    $this->validationData(), 
    $this->container->call([$this, 'rules']), 
    $this->messages(), 
    $this->attributes() 
); 

正如你可以看到它是非常不同于阿尔乔姆Verbo使用。

更好的办法是在你的ProductRequest类创建withValidator方法:

use Illuminate\Contracts\Validation\Validator; 

...

public function withValidator(Validator $validator) 
{ 
    $validator->sometimes('your_sometimes_field', 'your_validation_rule', function ($input) { 
     return $input->your_sometimes_field !== null; 
    }); 
}