验证不适用于控制器中的第二种形式

时间:2012-02-02 11:20:44

标签: php symfony

我有一个带有2个函数的控制器,每个函数都生成一个表单并传递给视图。

第一个是用户个人资料,并完美地获取Validation.yml文件 - 检查姓名和电子邮件是否为空白。

在同一验证文件中,我将密码设置为不为空白。

但是,第二种形式,允许用户更改其密码,不想验证。

第二种形式基本上是第一种形式的副本,但有两个字段,“密码”和“confirmPassword”。

当然,我的字段被称为“密码”,它应该与我的用户实体中的变量匹配? (这是第一种形式发生的事情)

一些代码:

passwordAction

    public function passwordAction(Request $request)
    {
        $form = $this->createFormBuilder()
                ->add('password', null, array('label' => 'New Password'))
                ->add('confirmPassword', null, array('label' => 'Confirm Password'))
                ->getForm();

        if ($request->getMethod() == 'POST') {
            $form->bindRequest($request);

            if ($form->isValid()) {
                // perform some action, such as saving the task to the database

                //return $this->redirect($this->generateUrl('dashboard'));
            }

        }

        return $this->render('UserBundle:Dashboard:password.html.twig', array('form' => $form->createView()));
    }
}

密码表格树枝:( nb - novalidate是关闭html5验证!!)

<form action="{{ path('update_password') }}" method="post" {{ form_enctype(form) }} novalidate="novalidate">
    <fieldset>
        <legend>Change Your Password</legend>
        {{ form_row(form.password) }}
        {{ form_row(form.confirmPassword) }}
    </fieldset>
    <fieldset>
        <div class="actions">
            <input class="btn primary" type="submit" value="Update" />
            <input class="btn error" type="reset" value="Reset">
        </div>
    </fieldset>
</form>

validation.yml:

UserBundle\Entity\Profile:
    properties:
        name:
            - NotBlank: ~

UserBundle\Entity\User:
    properties:
        email:
            - NotBlank: ~
            - Email:
                message: The email "{{ value }}" is not a valid email.
                checkMX: true
        password:
            - NotBlank: ~

的routing.yml:

password:
    pattern: /password
    defaults: { _controller: UserBundle:Dashboard:password }

update_password:
    pattern: /password
    defaults: { _controller: UserBundle:Dashboard:password }
    requirements:
        _method: POST

1 个答案:

答案 0 :(得分:3)

您尚未在表单中配置任何data_class选项, 并未使用$form->setData($user);作为表单中的任何数据。

验证器与要验证的任何内容都不匹配,因为没有要验证的UserBundle\Entity\User对象。

你应该做的是:

 $user = new UserBundle\Entity\User; // or fetch it from database.

 $form = $this->createFormBuilder()
     ->add('password', 'repeated')
     ->getForm()
 ;
 $form->setData($user);

这样,当您将新数据绑定到表单并对其进行验证时,它会知道您正在尝试验证UserBundle\Entity\User对象。

您会注意到我修改了您的代码以使用repeated字段类型,这完全符合您的要求。