我正在使用Laravel 5.5,而我正在尝试进行一些复杂的现场验证,而我似乎无法为此找到解决方案。
我有三个字段:
field_a
(布尔)
field_b
(字符串)
field_c
(字符串)
我需要验证,如果field_a
为真,则field_b
或field_c
不为空。
我试图做类似的事情:
'field_b' => 'required_with:field_a|required_if:field_c,',
'field_c' => 'required_with:field_a|required_if:field_b,',
但是,如果已将field_a
传递给请求,则这种方式需要两个字段。
提前感谢您的帮助。
答案 0 :(得分:0)
我无法使用Laravel的内置验证系统来进行此类验证,因此我创建了自己的自定义规则。我把它留在这里以防有人发现它有用。
class IfXOR implements Rule {
private $required;
private $fields;
/**
* Create a new rule instance.
*
* @param bool $required
* @param mixed $fields
* @return void
*/
public function __construct($required, $fields) {
$this->required = $required;
$this->fields = $fields;
}
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value) {
if(!$this->required) return true;
if(!is_array($this->fields)) return $value || !empty($this->fields);
return $value || !empty(array_filter(function($f) { return !empty($f); }, $this->fields));
}
/**
* Get the validation error message.
*
* @return string
*/
public function message() {
return 'The validation error message.';
}
}