【问题标题】:Symfony2 Validation doesn't work on reperated field (password confirmiation)Symfony2 验证不适用于重复字段(密码确认)
【发布时间】:2013-12-24 03:00:47
【问题描述】:

我是 Symfony2 的初学者。我阅读了食谱,并在互联网上搜索,但没有找到关于我的问题的答案。

这是我的表单类型:

 /**
 * Builds a form with given fields.
 *
 * @param object  $builder A Formbuilder interface object
 * @param array   $options An array of options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('password', 'repeated', array(
        'first_name' => 'password',
        'second_name' => 'confirm',
        'type' => 'password',
        'invalid_message' => 'Passwords do not match'
    ));
}
/**
 * Sets the default form options
 *
 * @param object $resolver An OptionsResolver interface object
 */
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'Opit\Notes\UserBundle\Entity\User',
    ));
}
/**
 * Get the name
 *
 * @return string name
 */
public function getName()
{
    return 'user';
}

用户是一个实体

这是树枝:

<form name="changePassword_frm" id="changePassword_frm" method="post">
<div class="modalwindow width-98 default-border height-auto overflow-hidden">
        {{ form_widget(form) }}
</div>

以及我的用户控制器中的函数(由 ajax 请求调用)

public function updatePasswordAction()
{
    $result = array('response' => 'error');
    $request = $this->getRequest();        
    $em = $this->getDoctrine()->getManager();

    $user = $this->getUserObject($request->attributes->get('id'));

    $form = $this->createForm(new ChangePasswordType(), $user);

    if ($request->isMethod("POST")) {
        $form->handleRequest($request);        

        if ($form->isValid()) {
            $encoder = $this->container->get('security.encoder_factory')->getEncoder($user);
            $newPassword = $encoder->encodePassword($user->getPassword(), $user->getSalt());
            $user->setPassword($newPassword);

            // Save the user.
            $em->persist($user);
            $em->flush();
            $result['response'] = 'success';
        }
    }
    return new JsonResponse(array($result)); 
}

验证不起作用,例如,如果我只填写了第一个字段(确认 - 第二个没有)。它是有效的!...所以 valid() 方法不会检查两个字段的值是否相等...

但是,如果我只填写“密码”字段而不填写“确认”字段...那么数据库中的密码将是散列的空字符串。 如果我填写两个,它们是相同的。它将是数据库中给定的密码。 (它有效,因为我可以用它登录到我的页面)。

但我不知道,为什么验证不起作用?为什么我没有收到任何错误信息? 我检查过,总是进入 isValid() 方法......总是。

【问题讨论】:

    标签: forms validation symfony passwords


    【解决方案1】:

    您需要使用 first_options 和 second_options 作为参数。看起来您正在使用 first_name 和 second_name。尝试更改您的 FormType:

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('password', 'repeated', array(
            'type' => 'password',
            'first_options' => array('label' => 'Password'),
            'second_options' => array('label' => 'Confirm'),
            'invalid_message' => 'Passwords do not match'
        ));
    }
    

    这将通过实际字段为您提供字段名称,而不仅仅是字段名称。此方法默认包含验证。

    【讨论】:

    • 几乎,唯一的问题,它不显示无效的消息。
    • 你确定你不会把它从 Twig 中删除吗?执行 {{ form(form) }} 或 {{ form_row(form.password) }} 这将包括我认为您缺少的 form_error 部分。
    猜你喜欢
    • 1970-01-01
    • 2012-03-19
    • 2015-12-11
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 2017-09-15
    • 2022-10-21
    • 2017-12-09
    相关资源
    最近更新 更多