ZF2嵌套数据验证

时间:2017-01-26 01:59:07

标签: zend-framework2 zend-form zend-inputfilter zend-form-fieldset

我正在尝试制作我的验证工作。我将数据发布到控制器,格式如下:

[
    'property' => 'value',
    'nested_property' => [
        'property' => 'value',
        // ...
    ]
]

我将字段/过滤器和表单分成不同的类,然后将它们一起收集在Form的控制器中,如下所示:

public function __construct($name, $options)
{
    // ...
    $this->add(new SomeFieldset($name, $options));
    $this->setInputFilter(new SomeInputFilter());
}

但它没有正常工作,看起来它只是忽略嵌套数组(或忽略所有内容)。我错过了什么?

谢谢。

1 个答案:

答案 0 :(得分:1)

如果您使用InputFilter类,则需要像设置表单一样设置inputfilter,包括字段集。

所以,当你有一个像:

这样的结构时
  1. MyForm
    1.1 NestedFieldset
    1.2 AnotherFieldset
  2. 您的输入过滤器需要具有相同的结构:

    1. MyFormInputFilter
      1.1 NestedFielsetInputFilter
      1.2 AnotherFieldsetInputFilter
    2. 一些示例代码:

      class ExampleForm extends Form
      {
          public function __construct($name, $options)
          {
              // handle the dependencies
              parent::__construct($name, $options);
      
              $this->setInputFilter(new ExampleInputFilter());
          }
      
          public function init()
          {
              // some fields within your form
      
              $this->add(new SomeFieldset('SomeFieldset'));
          }
      }
      
      class SomeFieldset extends Fieldset
      {
          public function __construct($name = null, array $options = [])
          {
              parent::__construct($name, $options);
          }
      
          public function init()
          {
              // some fields
          }
      }
      
      class ExampleInputFilter extends InputFilter
      {
          public function __construct()
          {
              // configure your validation for your form
      
              $this->add(new SomeFieldsetInputFilter(), 'SomeFieldset');
          }
      }
      
      class SomeFieldsetInputFilter extends InputFilter
      {
          public function __construct()
          {
              // configure your validation for your SomeFieldset
          }
      }
      

      因此,在这些情况下配置inputFilter的重要部分是,在$this->add($input, $name = null)类中使用InputFilter时,需要重复使用字段集的名称。