'person.mail' =>'required_without:person.phone|sometimes|email|unique:persons,mail',
'person.phone' => 'required_without:person.mail|sometimes|regex:/[0-9]/|size:10|unique:persons,phone'
我需要验证手机和邮件,其中一个是强制性的
当邮件为空并且电话没有时,验证会在电子邮件规则中失败,这是双向的,当邮件存在且电话为空时,它在正则表达式规则中失败
如果value为null,我怎么能停止验证?
答案 0 :(得分:6)
作为laravel docs州:
在某些情况下,您可能希望对a执行验证检查 仅当输入数组中存在该字段时才输入字段。快点 完成此操作,将有时规则添加到规则列表中。
我觉得您实际上发布了person[email]
和person[phone]
,在这种情况下sometimes
将指示验证继续,因为值将是空字符串(或者可能null
)而不是不存在。您可以通过创建自己的验证器,有条件地在检查密钥x是否存在之外的其他断言上添加规则,并使用其sometimes()
方法创建自己的断言:
$v = Validator::make($data, [
'person.email' => 'email|unique:persons,mail',
'person.phone' => 'regex:/[0-9]/|size:10|unique:persons,phone',
]);
$v->sometimes('person.email', 'required', function($input) {
return ! $input->get('person.phone');
});
$v->sometimes('person.phone', 'required', function($input) {
return ! $input->get('person.email');
});
这里的不同之处在于默认情况下字段 。例如,person.phone
可能为空,或者必须与正则表达式匹配。如果$input->get('person.email')
返回 falsy 值,则毕竟需要person.phone
。
作为一个说明,我认为你的正则表达式是错误的。只要person.phone
内的任何字符都是数字,它就会通过。我想你正在寻找这样的东西:
'person.phone' => 'regex:/^[0-9]{10}$/|unique:persons,phone'
答案 1 :(得分:0)
if(empty($request->all()['person']['mail']) && empty($request->all()['person']['phone'])){
$validator->errors()->add('person.mail', 'Mail or phone required');
$validator->errors()->add('person.phone', 'Mail or phone required');
return redirect("admin/people-create")->withInput()->withErrors($validator);
}