在Zend Framework的2 InputFilter中有条件地要求

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Zend Framework的2 InputFilter中有条件地要求相关的知识,希望对你有一定的参考价值。

我正在使用Zend Framework 2创建一个应用程序。我正在使用它的InputFilter来验证输入。是否有可能有条件地制作一些Inputs?我的意思是我有这样的代码:

$filter = new endInputFilterInputFilter();
$factory = new endInputFilterFactory();
$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 endInputFilterInputFilter();
$type   = new endInputFilterInput('type');
$smth   = new endInputFilterInput('smth');

$smth
    ->getValidatorChain()
    ->attach(new endValidatorNotEmpty(endValidatorNotEmpty::NULL))
    ->attach(new endValidatorCallback(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 endInputFilterInputFilter();
$type   = new endInputFilterInput('type');
$smth   = new endInputFilterInput('smth');

$smth
    ->getValidatorChain()
    ->attach(new endValidatorNotEmpty(endValidatorNotEmpty::NULL))
    ->attach(new endValidatorCallback(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'),
)));

以上是关于在Zend Framework的2 InputFilter中有条件地要求的主要内容,如果未能解决你的问题,请参考以下文章

Zend Framework 2 CSRF 验证

文件上传表单的 Zend 验证器大小 - Zend Framework 2.3

文件上传表单的 Zend 验证器大小 - Zend Framework 2.3

如何安装zend framework 2.4.11骨架应用程序

如何使用Zend Framework 2使用Rest API

Zend Framework 2 入门