Symfony2形成确认密码而不重复字段类型

时间:2015-06-10 22:30:36

标签: forms symfony

注册表单通常包含密码的确认字段。我们可以使用repeated字段类型在Symfony2中实现此目的。

但是,请说明您正在建立注册表格如下:

class RegistrationType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('user', new UserType());
        $builder->add(
            'terms',
            'checkbox',
            array('property_path' => 'termsAccepted')
        );
        $builder->add('Register', 'submit');
    }
...

FWIW,这实际上取自Symfony tutorial

这里的问题是我们添加了一个已包含密码字段的UserType。

一种解决方案是在UserType中使用repeated字段类型。但是,我想知道是否有办法在不修改UserType的情况下实现这一目标?

我考虑在注册类中添加一个字段:

/**
 * @Assert\EqualTo($this->user.getPassword())
 */
protected $confirmPassword;

但是getPassword()方法实际上返回了哈希密码,所以我不确定我是否正确地使用了这个...

你会怎么做?

2 个答案:

答案 0 :(得分:0)

不确定我是否完全理解,但我会试一试。

getPassword()仅返回哈希值的事实告诉您需要反向:对纯文本值进行哈希处理然后进行比较。但是在实体中这样做有点奇怪/无效,因为您无权访问容器或任何服务。

我建议采用以下方法:

class RegistrationType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        // the rest of your registration form, what you already have

        $encoderFactory = $options['encoder_factory'];

        $builder->addEventListener(FormEvents::SUBMIT, function(FormEvent $event) use ($encoderFactory) {
            // Instance of Registration
            $data = $event->getData();

            $encoder = $encoderFactory->getEncoder($data->getUser());

            // Second argument should be the salt or null. Do you intend to use it?
            $hash = $encoder->encodePassword($data->getConfirmPassword(), .... ); 

            // Overwrite the palin text value with hash
            $data->setConfirmPassword($hash);
        });
    }

关键点:

  1. 您需要将encoder_factory传递给您的注册表。

  2. 稍后,setConfirmPassword()来电完成后,验证将会运行,如果密码匹配,则运行正确

  3. 那么,这就是你想要做的事吗? :)

    P.S。请原谅我可能出现的错误,我正在输入这个记事本++ ...

答案 1 :(得分:0)

对于使用FOS_user的用户,我通过对属性plainPassword进行比较来解决了类似的问题。
取自Symfony tutorial

<code>
 /**
  * @Assert\EqualTo(propertyPath="plainPassword")
  */
 protected $confirmPassword;
</code>