php - Laravel 复杂条件验证

标签 php laravel laravel-validation

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

我试过了

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;
}

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

有什么线索可以帮助我吗?

谢谢!

最佳答案

您的代码运行良好。您只是忘记检查验证是否通过。 因为当你使用 Validator::make 时你需要手动检查它。 for request()->validate laravel 会为你做这件事。在您的 validateFundingSource () 函数中,只需在返回之前检查它是否通过验证,如下所示:

private 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));
        });

        // check if validae failed
        if($v->fails()) {
            dd('fail', $v); // do something when it failed
        }
    }

也很抱歉我的英语不好,希望对您有所帮助

关于php - Laravel 复杂条件验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60627618/

相关文章:

php - 将大量数组数据插入DB

php - 如何设置 PHP 错误日志的堆栈跟踪深度?

PHP getimagesize 空输出

php - Safari中如何处理字符为 'é'的URL?

php - 使用php将excel文件导入mysql如何动态获取/添加和插入列?

php - Laravel 验证 : required_with_all condition always passing

php - 在 Laravel 5 中更新时验证唯一的 Slug

php - Laravel 通过 where 和 join 进行独特的验证

php - 我可以使用 Laravel/Eloquent 预加载来加入相关表吗?

laravel - 图片有绝对路径 - 如何在 Laravel Mix 中使用子目录 URL