只有当所有其他指定字段都存在时,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
复制相似问题