我已经构建了一个表单类来生成一个表单,允许用户输入两次新密码才能更改它。
代码:
<?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”,因为它将使用普通的文本输入字段,这是不理想的。
任何想法的人?
答案 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');