【问题标题】:Zend3 InputFilter not validating FormZend3 InputFilter 不验证表单
【发布时间】:2018-11-14 08:58:21
【问题描述】:

我为我的问题找到了另一个帖子 (ZF2 InputFilter not validating fieldset),但它没有帮助。

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

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'
        ]);
    }

}

还有当前不工作的过滤器。

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

如果有人在控制器中需要我的 addAction:

public function addAction()
{
    $request = $this->getRequest();

    if ($request->isPost()) {
        $this->form->setData($request->getPost());

        if ($this->form->isValid()) {
            $this->mapper->save($this->form->getData());

            $this->redirect()->toRoute('categories');
        }
    }

    return [
        'form' => $this->form
    ];
}

在我找到的每个示例中,它都应该有效。但我的表单从未经过验证或过滤(使用修剪)。

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

【问题讨论】:

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


    【解决方案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 个字符

    【讨论】:

    • 到目前为止,很好地弄清楚了这一点。如果您愿意,可以进一步删除InputFilterProviderInterface。清洁一点。将要求您将 CategoryForm 添加到 CategoryFormInputFilterCategoryFieldsetInputFilter 作为孩子。我不久前创建了a repo 来帮助解决这个问题。还有一个example implementation。特别注意如何将 InputFilters 绑定到 Factory 类中的 Input。
    • @rkeet 看起来更好。我为固定过滤器绑定而苦苦挣扎。我将重建我的测试应用程序。非常感谢您的提示
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    • 2015-03-28
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多