【问题标题】:Validation doesn't work for second form in controller验证不适用于控制器中的第二种形式
【发布时间】:2023-03-08 20:53:01
【问题描述】:

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

第一个是用于用户配置文件并完美地选择 Validation.yml 文件 - 检查名称和电子邮件是否为空白。

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

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

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

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

一些代码:

密码操作

    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()));
    }
}

password form twig: (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

【问题讨论】:

    标签: php symfony


    【解决方案1】:

    您尚未在表单中配置任何 data_class 选项, 不要在表单中添加任何数据,例如使用$form-&gt;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 字段类型,这正是您想要的。

    【讨论】:

    • 哈哈,是的,不久之后我有点想通了,但非常感谢你的回答:)
    猜你喜欢
    • 2016-02-03
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多