Symfony2 - 无法设置密码表单字段以输入“密码”

时间:2012-02-14 11:11:15

标签: php symfony

我已经构建了一个表单类来生成一个表单,允许用户输入两次新密码才能更改它。

代码:

<?php

namespace UserBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
use Symfony\Component\Form\FormError;
use Symfony\Component\Form\CallbackValidator;

class PasswordType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder->add('password', null);
        $builder->add('confirmPassword', null, array('label' => 'Confirm Password', 'property_path' => false));
        $builder->addValidator(new CallbackValidator(function($form)
            {
                if($form['confirmPassword']->getData() != $form['password']->getData()) {
                    $form['confirmPassword']->addError(new FormError('Passwords must match.'));
                }
            }));
    }

    public function getDefaultOptions(array $options)
    {
        return array(
            'data_class' => 'UserBundle\Entity\User',
        );
    }

    public function getName()
    {
        return 'password';
    }
}

现在,这个类运行得很好,但我的问题是,当我设置第一个密码字段以输入“password”时,我收到此错误:

  

在“密码”类型中检测到循环引用(在“UserBundle \ Form \ Type \ PasswordType”类中定义。)

我不能将它设置为“null”,因为它将使用普通的文本输入字段,这是不理想的。

任何想法的人?

3 个答案:

答案 0 :(得分:4)

您定义了PasswordType表单类型字段。然后你在里面添加了一个密码类型的字段。这导致另一次调用PasswordType :: buildForm()来添加这种类型的另一个字段,它将永远存在。

解决方案是将您的密码类型重命名为“userpassword”,或者您可以使用repeated字段类型。它将添加两个字段并对其值进行比较验证。

答案 1 :(得分:1)

您可以使用重复字段类型代替您的解决方案,请参阅http://symfony.com/doc/2.0/reference/forms/types/repeated.html

答案 2 :(得分:0)

问题似乎是使用“password”作为getName()值。

在:

public function getName()
{
    return 'password';
}

后:

public function getName()
{
    return 'changePassword'; // basically anything other than 'password'
}

我将其更改为“通过”,现在我可以使用“密码”来设置类型,即

$builder->add('password', 'password');