自定义表单请求的条件验证

时间:2016-05-15 16:26:49

标签: php forms validation laravel laravel-5

我的控制器上有

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'
        ];
    }
}

有没有办法在保留我的自定义请求的同时执行此操作。我喜欢这种方法如何使控制器更清洁。

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

3 个答案:

答案 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;
    });
}