Forms Symfony2表单确认密码,无重复字段类型

Forms Symfony2表单确认密码,无重复字段类型,forms,symfony,Forms,Symfony,注册表单通常具有密码确认字段。我们可以通过使用字段类型在Symfony2中实现这一点 但是,假设您正在构建您的注册表格,如下所示: class RegistrationType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('user', new UserType());

注册表单通常具有密码确认字段。我们可以通过使用字段类型在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,这实际上是从一个

这里的问题是,我们添加了一个已经包含密码字段的用户类型

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

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

/**
 * @Assert\EqualTo($this->user.getPassword())
 */
protected $confirmPassword;
但是getPassword()方法实际上返回散列密码,因此我不确定我是否使用了此方法


你会怎么做?

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

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);
        });
    }
要点:
  • 您需要将
    编码器工厂
    传递到您的注册表中

  • 稍后,
    setConfirmPassword()
    调用完成后,将运行验证,如果密码匹配,则运行肯定验证

  • 那么,这就是你想要做的吗?:)


    顺便说一下,请原谅潜在的错误,我正在将这些信息直接输入记事本++…

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

    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);
            });
        }
    
    要点:
  • 您需要将
    编码器工厂
    传递到您的注册表中

  • 稍后,
    setConfirmPassword()
    调用完成后,将运行验证,如果密码匹配,则运行肯定验证

  • 那么,这就是你想要做的吗?:)


    请原谅潜在的错误,我是在记事本++中直接输入的。

    我已经解决了一个类似的问题,为那些使用FOS_用户应用了与属性plainPassword的比较。
    摘自一本书


    我通过对使用FOS_user的用户应用与属性plainPassword的比较,解决了类似的问题。
    摘自一本书


    我没试过,但我明白你的意思。我想这会使我的代码变得不必要的复杂。我将改为更新我的UserType类。似乎更合适。我没试过,但我明白你的意思。我想这会使我的代码变得不必要的复杂。我将改为更新我的UserType类。似乎更合适。我没试过,但我明白你的意思。我想这会使我的代码变得不必要的复杂。我将改为更新我的UserType类。似乎更合适。