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