只有当所有其他指定字段都存在时,required_with_all:foo、bar、.被验证的字段才必须存在。
这是我的测试:
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时,这个测试就通过了。
类似地,如果您反转角色,如
'param' => 'required_without_all:foo',并将foo作为输入传递
array('param' => $param, 'foo' => 'bar')我希望,由于foo存在,所以不能将param作为输入。但测试还是通过了。
在这两种情况下,我都应该看到错误。这是怎么回事?
我还知道,我的验证函数没有错,因为我的其他验证工作。例如添加这样的条件:
'param' => 'required_with_all:foo|numeric',它确实抛出了一个错误The param must be a number.
发布于 2016-02-10 20:52:23
我终于想出了答案。我误解了整个required_if的概念。这个答案对任何被困在这里的人都有帮助。关键是一遍又一遍地阅读拉拉文件;)
概念
对于required_with_all,它说:如果所有其他指定的字段都存在,那么被验证的字段必须只存在,只有。
例如,param => required_with_all:foo,bar,...意味着当foo和bar同时存在,而param不存在时,则会发生验证错误。
我误解了它,如果param在那里,那么它要求foo和bar也在那里。不过,正如我们刚才看到的,情况正好相反。
替代方案
如果您需要在foo上执行required_with验证规则( if param is present, foo must be present ),如下所示:
'param' => 'required_with:foo',
'foo' => 'required_with: param这将确保如果foo或param,任何人都在场,他们将要求其他人也在场。
对我测试用例的解释
第一测试用例
'param' => 'required_with_all:foo'我传递了以下输入
array('param' => $param)测试用例失败,因为foo没有在输入中,没有触发验证,因为规则规定只在foo出现时进行检查。因此,与其将param作为输入传递,只需将foo作为输入传递,您将看到当foo存在时需要param的错误。
第二测试用例
'param' => 'required_without_all:foo',并像这样传递输入:
array('param' => $param, 'foo' => 'bar')这个验证不起作用,因为它说只有当foo不存在时才需要param。然而,在我的输入中,我通过了foo。同时删除foo和param,您将看到一个错误,即当foo不存在时,就需要param。
我真傻!
https://stackoverflow.com/questions/35324478
复制相似问题