【问题标题】:Zend Framework 2 - I can't manage to validate form when using fieldsetsZend Framework 2 - 使用字段集时我无法验证表单
【发布时间】:2013-12-27 12:42:15
【问题描述】:

我有一个注册表单。

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/”)提交表单,那么它什么也不会说,也不会出现验证错误。所以,我假设这里没有进行验证。

有什么线索吗? 在学习使用文件集之前,我有一个非常好用的 InputFilter,但是按照本书的学习曲线,我开始使用 Fieldset。

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

【问题讨论】:

  • 我认为该错误消息与name 字段有关,因为您没有对其值指定任何验证,也没有指出是否需要它。在这种情况下,ZF2 将字段标记为必填项,然后附加默认的 NotEmpty 验证器。而且我不认为在没有任何验证的情况下留下任何字段是个好主意。首先在'name' => ... 设置数组元素'required' => false 之后,如果消息消失,则问题已定位。
  • @Microbe 我不确定我是否明白你所说的“因为你没有指定任何验证......”。 “getInputFilterSpecification”中没有指定验证吗?另外......我没有得到我应该把'required' => false(是['identifier'] ['required'] => false吗?在“getInputFilterSeciffication”的返回数组中)我试过了, 不用找了。我还有其他带有“NotEmpty”和“StringLength”的字段(如密码字段),带有不会触发的最小/最大验证。为什么其他字段也没有出现相同的验证错误(“需要值 [...]”)?
  • 对不起,我的错误,我错误地理解了你的代码。我会发布一个答案。

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


【解决方案1】:

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

<?php

use Zend\InputFilter\InputFilterProviderInterface;

class RegisterFieldsetUser extends Fieldset
    implements InputFilterProviderInterface
{
    ...
}

【讨论】:

  • 我确实有更多的字段,我只留下了一个来缩短我在 stackoverflow 上的帖子。在去“$identifier = new \Zend\Form\Element\Email(); $identifier->setName()->setAttributes() 等”之前,我实际上使用了你写的代码,由书(现在切换回它)。正如你提到的那样,我还添加了 'required' => false 并向我展示了......我不再得到“值是必需的并且不能为空”......但仍然没有发生其他验证。如果我提交空表单或包含无效数据(较短的密码)的表单,$registerForm->isValid() 返回 true。
  • 是的......这解决了它。猜猜这本书需要在这里和那里进行一些更新......谢谢!我可以通过您的回答(我做了)单击复选标记,但我还不允许投票。再次感谢!
  • 我查了一下书,一切正常。
  • 我的示例来自本书的第 181 页(根据我的需要进行了修改,基于我选择开始的小型 zf2 项目,而不是从字面上遵循书中的代码)。在那里,fieldset 类没有实现 InputFilterProviderInterface。我刚刚重新下载了这本书(只是为了确保它自八月以来没有更新,当时我相信它已经完成了)。否则,一本好书。从“新手级别”开始教授 zf2 的资源并不多。还有一个(使用 zf2),但对于 db 部分,它专注于 Doctrine(我想要“普通”zf2),而且还没有完成。
猜你喜欢
  • 2017-01-08
  • 1970-01-01
  • 1970-01-01
  • 2018-04-19
  • 2012-12-05
  • 1970-01-01
  • 2016-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多