我正在使用Zend Framework 2创建一个应用程序。我正在使用它的InputFilter
来验证输入。是否有可能有条件地制作一些Input
s?我的意思是我有这样的代码:
$filter = new \Zend\InputFilter\InputFilter();
$factory = new \Zend\InputFilter\Factory();
$filter->add($factory->createInput(array(
'name' => 'type',
'required' => true
)));
$filter->add($factory->createInput(array(
'name' => 'smth',
'required' => true
)));
我想要something
这个领域,只有当type
等于1
时才需要。有没有内置的方法来做到这一点?或者我应该创建自定义验证器?
首先,您可能希望从Empty values passed to Zend framework 2 validators开始对空/空值进行验证
您可以使用回调输入过滤器,如下例所示:
$filter = new \Zend\InputFilter\InputFilter();
$type = new \Zend\InputFilter\Input('type');
$smth = new \Zend\InputFilter\Input('smth');
$smth
->getValidatorChain()
->attach(new \Zend\Validator\NotEmpty(\Zend\Validator\NotEmpty::NULL))
->attach(new \Zend\Validator\Callback(function ($value) use ($type) {
return $value || (1 != $type->getValue());
}));
$filter->add($type);
$filter->add($smth);
当值smth
为空字符串且type
的值不是1
时,这基本上有效。如果type
的值是1
,那么smth
必须与空字符串不同。
由于$ type-> getValue始终为NULL,我无法通过Ocramius的示例来完成工作。我稍微更改了代码以使用$ context,这对我有用:
$filter = new \Zend\InputFilter\InputFilter();
$type = new \Zend\InputFilter\Input('type');
$smth = new \Zend\InputFilter\Input('smth');
$smth
->getValidatorChain()
->attach(new \Zend\Validator\NotEmpty(\Zend\Validator\NotEmpty::NULL))
->attach(new \Zend\Validator\Callback(function ($value, $context){
return $value || (1 != $context['type']);
}));
$filter->add($type);
$filter->add($smth);
您也可以使用setValidationGroup
。
创建自己的InputFilter
类,在执行实际验证之前,根据inputfilter中设置的数据设置验证组。
class MyInputFilter extends InputFilter
{
setData($data){
if(isset($data['type']) && $data['type'] === 1){
// if we have type in data and value equals 1 we validate all fields including something
setValidationGroup(InputFilterInterface::VALIDATE_ALL);
}else{
// in all other cases we only validate type field
setValidationGroup(['type']);
}
parent::setData($data);
}
}
这只是展示setValidatioGroup
可能性的一个简单示例,您可以根据具体需要创建自己的组合来设置验证组。
不幸的是,您必须根据您的条件设置所需的选项,如下所示:
$filter->add($factory->createInput(array(
'name' => 'smth',
'required' => (isset($_POST['type']) && $_POST['type'] == '1'),
)));