Zend3 InputFilter无法验证表单

时间:2018-11-14 08:58:21

标签: zend-framework zend-form zend-framework3 zend-filter

我为我的问题找到了另一篇文章(ZF2 InputFilter not validating fieldset),但没有帮助。

我有一个类别实体,我想验证标题的长度。 所以我的模型(没有现有的getter和setter)

// namespace a

class Category { /** * @var int */ private $id; /** * @var string */ private $name; } 的我的表单:

Category

还有当前无法使用的过滤器。

class CategoryForm extends Form
{

    public function init()
    {

        $this->setHydrator(new ClassMethods(false));
        $this->setObject(new Category());
        $this->setInputFilter(new CategoryFilter());

        $this->add([
            'name' => 'id',
            'type' => 'hidden'
        ]);

        $this->add([
            'name' => 'name',
            'type' => 'text'
        ]);

        $this->add([
            'name' => 'submit',
            'type' => 'submit'
        ]);
    }

}

如果有人在Controller中需要我的addAction:

class CategoryFilter extends InputFilter
{
    public function init()
    {
        $this->add([
            'name' => 'name',
            'required' => true,
            'filters' => [
                ['name' => StringTrim::class]
            ],
            'validators' => [
                [
                    'name' => StringLength::class,
                    'options' => [
                        'min' => 5
                    ]
                ]
            ]
        ]);
    }
}

在我发现的每个示例中,它都应该正常工作。但是我的表单从未得到验证或过滤(带有修饰)。

我忘记了什么吗?为什么不起作用?

1 个答案:

答案 0 :(得分:1)

所以我做了一些改动。

类别表转到:

class CategoryForm extends Form
{

    public function init()
    {
        $this->add(array(
            'type' => CategoryFieldSet::class,
            'options' => array(
                'use_as_base_fieldset' => true,
            ),
        ));

        $this->add([
            'name' => 'submit',
            'type' => 'submit'
        ]);
    }
}

我也更改了过滤器

class CategoryFilter extends InputFilter
{
    public function __construct()
    {
        $this->add([
            'name' => 'name',
            'required' => true,
            'filters' => [
                ['name' => StringTrim::class]
            ],
            'validators' => [
                [
                    'name' => StringLength::class,
                    'options' => [
                        'min' => 5
                    ]
                ]
            ]
        ]);
    }
}

然后,我使用验证器定义了FieldSet:

class CategoryFieldSet extends Fieldset implements InputFilterProviderInterface
{
    /**
     *
     */
    public function init()
    {
        $this->setHydrator(new ClassMethods(false));
        $this->setObject(new Category());

        $this->add([
            'name' => 'id',
            'type' => 'hidden'
        ]);

        $this->add([
            'name' => 'name',
            'type' => 'text',
        ]);
    }

    /**
     * Should return an array specification compatible with
     * {@link Zend\InputFilter\Factory::createInputFilter()}.
     *
     * @return array
     */
    public function getInputFilterSpecification()
    {
        $filter = new CategoryFilter();

        return $filter->getInputs();
    }
}

更改此设置后,我得到预期的错误消息,如:

  

输入的字符少于5个字符