首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Laravel验证: required_with_all条件总是通过

Laravel验证: required_with_all条件总是通过
EN

Stack Overflow用户
提问于 2016-02-10 19:43:08
回答 1查看 2.4K关注 0票数 3

根据laravel验证文件

只有当所有其他指定字段都存在时,required_with_all:foo、bar、.被验证的字段才必须存在。

这是我的测试:

代码语言:javascript
运行
复制
    Route::get('/test/{param}', function($param) {
        $screenRules = array(
            'foo' => 'string',
            'param' => 'required_with_all:foo',

        );

        $validator = Validator::make(array('param' => $param), $screenRules);
        if($validator->fails())
        {
            echo '<pre>';
            print_r($validator->errors());
            echo '</pre>';
            die('Dying now!');
        }
        else
        {
            echo 'All Good!';
            die('Dying now!');
        }
    });

我希望,由于我没有通过foo,这个测试应该会失败。但是当我调用url:mysite.com/test/mytest时,这个测试就通过了。

类似地,如果您反转角色,如

代码语言:javascript
运行
复制
'param' => 'required_without_all:foo',

并将foo作为输入传递

代码语言:javascript
运行
复制
array('param' => $param, 'foo' => 'bar')

我希望,由于foo存在,所以不能将param作为输入。但测试还是通过了。

在这两种情况下,我都应该看到错误。这是怎么回事?

我还知道,我的验证函数没有错,因为我的其他验证工作。例如添加这样的条件:

代码语言:javascript
运行
复制
'param' => 'required_with_all:foo|numeric',

它确实抛出了一个错误The param must be a number.

EN

Stack Overflow用户

发布于 2016-02-10 20:52:23

我终于想出了答案。我误解了整个required_if的概念。这个答案对任何被困在这里的人都有帮助。关键是一遍又一遍地阅读拉拉文件;)

概念

对于required_with_all,它说:如果所有其他指定的字段都存在,那么被验证的字段必须只存在,只有

例如,param => required_with_all:foo,bar,...意味着当foo和bar同时存在,而param不存在时,则会发生验证错误。

我误解了它,如果param在那里,那么它要求foobar也在那里。不过,正如我们刚才看到的,情况正好相反。

替代方案

如果您需要在foo上执行required_with验证规则( if param is present, foo must be present ),如下所示:

代码语言:javascript
运行
复制
'param' => 'required_with:foo',
'foo' => 'required_with: param

这将确保如果fooparam,任何人都在场,他们将要求其他人也在场。

对我测试用例的解释

第一测试用例

代码语言:javascript
运行
复制
'param' => 'required_with_all:foo'

我传递了以下输入

代码语言:javascript
运行
复制
array('param' => $param)

测试用例失败,因为foo没有在输入中,没有触发验证,因为规则规定只在foo出现时进行检查。因此,与其将param作为输入传递,只需将foo作为输入传递,您将看到当foo存在时需要param的错误。

第二测试用例

代码语言:javascript
运行
复制
'param' => 'required_without_all:foo',

并像这样传递输入:

代码语言:javascript
运行
复制
array('param' => $param, 'foo' => 'bar')

这个验证不起作用,因为它说只有当foo不存在时才需要param。然而,在我的输入中,我通过了foo。同时删除fooparam,您将看到一个错误,即当foo不存在时,就需要param。

我真傻!

票数 4
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35324478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档