6

我正在使用 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。有没有内置的方法可以做到这一点?还是我应该只创建自定义验证器?

4

4 回答 4

8

首先,您可能希望从传递给 Zend 框架 2 验证器的空值开始对空/空值启用验证

您可以使用回调输入过滤器,如下例所示:

$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必须不同于空字符串。1smth

于 2013-02-27T11:31:59.853 回答
3

我无法让 Ocramius 的示例正常工作,因为 $type->getValue 始终为 NULL。我稍微更改了代码以使用 $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);
于 2013-05-31T09:30:22.630 回答
0

您也可以使用setValidationGroup它。

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

于 2019-04-23T15:50:25.613 回答
-3

不幸的是,您必须根据您的条件设置所需的选项,如下所示:

$filter->add($factory->createInput(array(
    'name' => 'smth',
    'required' => (isset($_POST['type']) && $_POST['type'] == '1'),
)));
于 2012-12-19T00:21:12.743 回答