Zend3 InputFilter не проверяет форму - PullRequest
0 голосов
/ 14 ноября 2018

Я нашел другой пост ( ZF2 InputFilter не проверяет fieldset ) для моей проблемы, но это не помогло.

У меня есть объект категории, и я хочу проверитьдлина заголовка.Итак, моя модель (без существующего геттера и сеттера)

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

В каждом найденном примере он должен работать.Но моя форма никогда не проверяется и не фильтруется (с отделкой).

Я что-то забыл?Почему это не работает?

1 Ответ

0 голосов
/ 14 ноября 2018

Так что я немного изменился.

Форма категории:

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 символов

...