required_without不使用其他规则

问题描述 投票:3回答:2
'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,我怎么能停止验证?

laravel laravel-5 laravel-validation
2个回答
6
投票

作为laravel docs国家:

在某些情况下,只有在输入数组中存在该字段时,您可能希望对字段运行验证检查。要快速完成此操作,请将有时规则添加到规则列表中。

我觉得你实际上发布了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')返回一个假值,那么毕竟需要person.phone

作为一个说明,我认为你的正则表达式是错误的。只要person.phone中的任何字符都是数字,它就会通过。我想你正在寻找这样的东西:

'person.phone' => 'regex:/^[0-9]{10}$/|unique:persons,phone'

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);
    }
© www.soinside.com 2019 - 2024. All rights reserved.