1)我是laravel的新手,想要整合验证规则。我的要求是根据另外两个字段强制要求第三个字段。如果a和b都为真,则需要字段C.我已经使用 required_if 来基于其他单个字段进行验证,但是如何使用 required_if 检查两个字段?
2)为了实现上述功能,我也尝试了自定义验证规则。但只有在我同时提出所需规则的情况下,它才能正常工作。
例如:
'number_users' => 'required|custom_rule' //working
'number_users' => 'custom_rule' //Not working
答案 0 :(得分:14)
您可以使用conditional rules。
这是一个简单的例子:
$input = [
'a' => true,
'b' => true,
'c' => ''
];
$rules = [
'a' => 'required',
'b' => 'required'
// specify no rules for c, we'll do that below
];
$validator = Validator::make($input, $rules);
// now here's where the magic happens
$validator->sometimes('c', 'required', function($input){
return ($input->a == true && $input->b == true);
});
dd($validator->passes()); // false in this case
答案 1 :(得分:1)
您还可以创建一个通用验证器来测试AND运算符。
Validator::extend('required_multiple', function ($attribute, $value, $parameters, $validator) {
$isRequired = true;
for ($i = 0; $i <= count($parameters) / 2; $i = $i + 2) {
$parameter = $parameters[$i];
$value = $parameters[$i + 1];
if (in_array($value, ['true', 'false'])) {
$value = (bool)$value;
}
if ($validator->getData()[$parameter] !== $value) {
$isRequired = false;
}
}
if (!$isRequired || ($isRequired && $validator->getData()[$attribute])) {
return true;
} else {
return false;
}
});
然后在您的控制器规则中:
'phone_input_label' => 'required_multiple:goal,lead-capture,phone_input_active,true|string',
如果目标等于“潜在顾客捕获”,则这将需要“ phone_input_label”。 并且phone_input_active为true。
该自定义验证程序的唯一问题是您需要发送所有参数。如果在请求中未发送“ phone_input_label”,则它甚至都不会通过自定义验证器,因此不确定为什么会发生。
答案 2 :(得分:0)
Laravel评估给予者顺序中的每个规则。让我们说:
'number_users' => 'required|custom_a|custom_b'
当custom_b
和required
为真时,将评估 custom_b
规则,因为这些规则已经过评估。
答案 3 :(得分:0)
这是你的答案
'field3' => 'required_if:field_1 | required_if:field_2'
答案 4 :(得分:-3)
看一下我粘贴下面链接的laravel验证文档,您可以使用required_if,required_without和其他来满足您的需求。