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

时间:2012-11-17 17:37:25

标签: php zend-framework2 zend-form

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

$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。有没有内置的方法来做到这一点?或者我应该创建自定义验证器吗?

5 个答案:

答案 0 :(得分:8)

首先,您可能希望从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必须与空字符串不同。

答案 1 :(得分:3)

由于$ 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);

答案 2 :(得分:0)

您也可以使用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可以实现的功能,您可以根据自己的特定需求创建自己的组合来设置验证组。

答案 3 :(得分:0)

$inputFilter->add([
        'name' => 'commPersconphone1number',
        'required' => (($this->session->ouCode == '50001') ? true : false),
        'error_message' => $this->arrLabels['err_phone'],
        'filters' => [
            ['name' => 'StringTrim'],
            ['name' => 'StripTags'],
            ['name' => 'StripNewlines'],
        ],
        'validators' => [
            [
                'name' => 'StringLength',
                'options' => [
                    'min' => 0,
                    'max' => 15,
                    'error_message' => $this->arrLabels['err_phone_invalid']
                ],
            ],
            [
                'name' => 'Regex',
                'options' => [

                    'pattern' => '/^[0-9]*$/',
                    'message' => $this->arrLabels['err_phone_invalid'],
                ],
            ],
        ],
    ]);

答案 4 :(得分:-3)

不幸的是,你必须根据你的条件设置所需的选项:

$filter->add($factory->createInput(array(
    'name' => 'smth',
    'required' => (isset($_POST['type']) && $_POST['type'] == '1'),
)));