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

Php 自定义表单请求的条件验证,php,forms,validation,laravel,laravel-5,Php,Forms,Validation,Laravel,Laravel 5,在我的控制器上,我有: public function store(ProductRequest $request) 请求: class ProductRequest extends Request { public function rules() { return [ 'name' => 'required|min:3', 'perTypeTime' => 'sometimes|required'

在我的控制器上,我有:

 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;
});
有没有办法做到这一点,同时保持我的自定义请求。我喜欢这种方法使控制器更干净

我似乎无法访问请求对象上的验证程序。有没有办法在请求本身内部指定此条件,或者从请求对象访问验证器,或者有没有其他办法?

您可以这样做

我想将上面的perTypeTime规则更改为有条件的,这取决于per_type_id字段是否=1

ProductRequest
中的
rules()
方法中。 有关详细信息,请参见中的另一个字段,值


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

use Illuminate\Validation\Factory;

其实这个答案不是最好的。 我们不必用自己的验证器替换默认验证器(因为我们没有改变任何东西)。在该解决方案中,我们希望验证工厂始终只需要两个属性($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;


此方法适用于此特定用例,但并不能解决问题的根源:如果我有一个只与我的业务相关的非常特殊的验证,如
userisagar()
?重写验证器函数,该怎么办。这就是我一直在寻找的,谢谢。这个解决方案从那时起就可以使用,所以它也适用于5.3之前的版本。
$factory->make(
    $this->validationData(), 
    $this->container->call([$this, 'rules']),
    $this->messages(), 
    $this->attributes()
);
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;
    });
}