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