Laravel复杂条件验证

问题描述 投票:1回答:2

我正在尝试创建一个至少需要三个输入之一的验证器。

我尝试过此

protected function validateFundingSource (): array
{
    return request()->validate([
       'title'       => 'required',
       'description' => 'required',
       'national'       => 'nullable',
       'province'       => Rule::requiredIf(!request('national')),
       'url'            => [
           'required_without_all:phone,email',
           'active_url'
       ],
       'phone'          => [
           'required_without_all:url,email|regex:/^(\+\s?)?1?\-?\.?\s?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}(?: *#(\d+))?\s*$/im'
       ],
       'email' => [
           'required_without_all:url,phone|email:rfc,dns'
       ],
       'categories' => 'exists:categories,id'
   ]);
}

但是它只强制第一个字段(url)。所以我尝试了Complex Conditional Validation

protected function validateFundingSource ()
{

    $v = Validator::make(request()->all(), [
            'title'       => 'required',
            'description' => 'required',
            'national'       => 'nullable',
            'categories'     => 'exists:categories,id',
    ]);

    $v->sometimes('province', 'required', function ($input) {
        return ($input->national === null) ;
    });

    $v->sometimes('url', 'required|active_url', function ($input) {
        return (($input->phone === null) && ($input->email === null));
    });

    $v->sometimes('phone', 'required|regex:/^(\+\s?)?1?\-?\.?\s?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}(?: *#(\d+))?\s*$/im', function ($input) {
        return (($input->url === null) && ($input->email === null));
    });

    $v->sometimes('email', 'required|email:rfc,dns', function ($input) {
        return (($input->url === null) && ($input->phone === null));
    });

    return $v;
}

但是仍然没有运气...现在不需要我可以提交所有三个空白字段,并且可以正常工作...

有任何帮助我的线索吗?

谢谢!

php laravel laravel-validation
2个回答
1
投票
也为我的英语不好对不起,希望对您有所帮助

1
投票
您可能还希望改善您的电话号码正则表达式; required_without_all不是很好的电话号码,但可以通过您的验证。我建议清理您的值以除去数字和前导+之外的所有内容,然后在剩下的地方使用更好的模式。

而且,这只是外观上的更改,但您可以像其他规则一样用简单的+ -. (000-111.9999 #8规则替换Rule::requiredIf(!request('national')),

更改为required_if,这看起来像:form request validation
© www.soinside.com 2019 - 2024. All rights reserved.