【问题标题】:Zend - form doesn't get validatedZend - 表单没有得到验证
【发布时间】:2015-05-17 09:36:13
【问题描述】:

我正在尝试在实际表单本身中验证表单,但它根本没有得到验证。如果我输入“someemail&*!([]@gmail.com”,它并没有真正给废话,而是继续前进。 表格:

class RecoverPasswordForm extends Form {
    public function __construct($options = null) {
        parent::__construct("RecoverPassword");

        $username = new Element("username");
        $username->setLabel("Email");
        $username->setAttributes(
            array('filters' => array(
                array('name' => 'StringTrim'),
                array('name' => 'StripTags')),
                'validators' => array(
                    array(
                        'name' => 'Regex',
                        'options' => array(
                            'pattern' => '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/',
                            'messages' => array(
                                Regex::NOT_MATCH => 'The email your provided has invalid characters.',
                            ),
                        ),
                        'break_chain_on_failure' => true
                    ),
                    array(
                        'name' => 'EmailAddress',
                        'options' => array(
                            'messages' => array(
                                EmailAddress::INVALID_FORMAT => "Email address is invalid",
                                EmailAddress::INVALID => "",
                                EmailAddress::INVALID_LOCAL_PART => "",
                                EmailAddress::INVALID_HOSTNAME => "",
                                EmailAddress::INVALID_SEGMENT => "",
                                EmailAddress::DOT_ATOM => "",
                                EmailAddress::INVALID_MX_RECORD => "",
                            ),
                        ),
                    ),
                ),
                'label' => 'Email'));
        $this->add(array(
            $username,

        ));
    }
}

我如何获得(或试图获得)控制器中的过滤器和验证器:

      public function recoverPasswordAction() {
        $this->cache = new Container("cache");
        $request = $this->getRequest();
        $form = new RecoverPasswordForm();
//      $form->get("submit")->setValue("Send mail");
        $this->view->form = $form;
        if ($request->isPost()) {
            $user = new User();
            $form->getInputFilter()->getValues();
            $form->setInputFilter($form->getInputFilter());
            $data = $request->getPost();
            $form->setData($data);
            $username = $data['username'];
            $userData = $this->getServiceLocator()->get("UserTable")->fetchList("`username` LIKE '$username'");
            if (!count($userData) > 0) {
                $this->cache->error = "A user with this email does not exist, plese try again.";
            }
                if ($form->isValid()) {
                    foreach ($userData as $user) {
                        $user->sendMail(6);
                        $this->cache->success = "A message has been send to this email, containing your password.";
                    }
                }
        }
        return $this->view;
    }

【问题讨论】:

  • 没有错误,只是没有验证
  • 在调用$form->getInputFilter()->getValues()之前是否调用了$form->isValid(); ?
  • @MarcinTwardowski 用控制器代码更新了我的帖子
  • 没有必要 GET/SET inputFilter,尝试删除它,并且提示,在获取表单验证之前不要查询 DB,您将暴露于 SQL 注入。首先询问您的表格是否有效。

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


【解决方案1】:

试试这样...

$request = $this->getRequest();

$form = new Form();

if($request->isPost()) {
    if($form->isValid($reguest->getPost())) {
        $values = $form->getValues(); //filtered valid array of values

        $username = $form->getValue('username');


    }
}
$this->view->form = $form;

【讨论】:

    【解决方案2】:

    我认为这是因为验证器的错误实现。

    您可以尝试在您的表单上实现InputProviderInterface 吗? docs 中给出了基本示例。它在元素上设置,但您也可以在表单上执行此操作。这个接口定义了getInputSpecification,你必须在其中返回一个带有过滤器和验证器规范的数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-06
      • 1970-01-01
      • 2017-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多