:
startTime = new Date();
请求:
public function store(ProductRequest $request)
我想将上面的perTypeTime规则更改为条件,具体取决于per_type_id字段== 1.
如果我在控制器中启动验证器,我相信我可以执行以下操作:
class ProductRequest extends Request
{
public function rules()
{
return [
'name' => 'required|min:3',
'perTypeTime' => 'sometimes|required',
'per_type_id' => 'required'
];
}
}
有没有办法在保留我的自定义请求的同时执行此操作。我喜欢这种方法如何使控制器更清洁。
我似乎无法访问请求对象上的验证器。有没有办法在请求本身内指定这个条件,或者从请求对象访问验证器,还是有另一种方式?
答案 0 :(得分: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;
}
答案 1 :(得分:2)
你可以这样做
我想将上面的perTypeTime规则更改为条件,具体取决于per_type_id字段== 1.
在您rules()
的{{1}}方法中。
有关详细信息,请参阅Laravel documentation validation rules中的 required_if:anotherfield,value 。
ProductRequest
答案 2 :(得分: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()
);
正如您所看到的,它与Artem 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;
});
}