Zend Framework 2 - 我无法在使用fieldsets时验证表单

时间:2013-12-27 12:42:15

标签: php validation zend-framework2 zend-form fieldset

我有一份注册表。

namespace User\Form;

use Zend\Form\Form;

class Register extends Form {

    public function __construct() {
        parent::__construct('register');
        $this->setAttribute('action', 'new-account');
        $this->setAttribute('method', 'post');

        //$this->setInputFilter(new \User\Form\RegisterFilter); - used this prior to learning Fieldset
        $this->add(new \User\Form\RegisterFieldsetUser);

        // Submit
        $this->add(array(
            'name' => 'submit',
                'attributes' => array(
                'type' => 'submit',
                'value' => 'Register',
                'class' => 'btn btn-primary',
            ),
        ));
    }
}

和用户字段集: (为了做这个简短,我只留在场上)

namespace User\Form;

use Zend\Form\Fieldset;

class RegisterFieldsetUser extends Fieldset {

    public function __construct() {
        parent::__construct('user');

        // User Identifier
        $identifier = new \Zend\Form\Element\Email();
        $identifier->setName('identifier');
        $identifier->setAttributes(array(
            'id' => 'user-email',
            'placeholder' => 'Email'
        ));
        $identifier->setLabel('Your email:');

        $this->add($identifier);
    }

    public function getInputFilterSpecification() {
        return array(
            'identifier' => array(
                'filters' => array(
                    array('name' => 'StringTrim'),
                ),
                'validators' => array(
                    array(
                        'name' => 'NotEmpty',
                        'break_chain_on_failure' => true,
                        'options' => array(
                            'messages' => array(
                                \Zend\Validator\NotEmpty::IS_EMPTY => 'You really have to enter something!',
                            ),
                        ),
                    ),
                    array(
                        'name' => 'EmailAddress',
                        'options' => array(
                            'messages' => array(
                                \Zend\Validator\EmailAddress::INVALID_FORMAT => 'Hmm... this does not look valid!',
                            ),
                        ),
                    ),
                ),
            ),
        );
    }
}

这是我的行动:

public function registerAction() {
    $registerForm = new \User\Form\Register;

    if ($this->getRequest()->isPost()) {
        // Form processing
        $formData = $this->getRequest()->getPost();
            if ($registerForm->isValid()) {
                // Yeeeeei
            } else {
                $registerForm->setData($formData);
                return new ViewModel(array(
                    'form' => $registerForm,
                ));
            }
    } else {
        return new ViewModel(array(
            'form' => $registerForm,
        ));
    }
}

现在,如果我在没有输入任何内容的情况下提交表单,我会收到消息:“值是必需的,不能为空”(这不是我设置的消息)。但这不是我设置的消息的问题,因为如果我提交的表单中包含无效的电子邮件地址(“asd /”),那么它没有说什么,没有验证错误。所以,我认为这里没有验证。

有什么线索的原因? 在学习使用fieldsset之前,我有一个完美的InputFilter,但是按照本书的学习曲线,我开始使用Fieldset。

我只是一个zf newb,从我从leanpub购买的这本书中学习(Michael Romer的“使用zf2进行Web开发”)。我不知道本书中使用的版本(它最后一次更新于2013年8月),但我使用的是最新版本(2.2.5)。

1 个答案:

答案 0 :(得分:1)

如果要通过getInputFilterSpecification方法添加过滤器规范,您的表单类(或字段集类)必须实现InputFilterProviderInterface。所以:

<?php

use Zend\InputFilter\InputFilterProviderInterface;

class RegisterFieldsetUser extends Fieldset
    implements InputFilterProviderInterface
{
    ...
}