注册表单通常包含密码的确认字段。我们可以使用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()方法实际上返回了哈希密码,所以我不确定我是否正确地使用了这个...
你会怎么做?
答案 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);
});
}
您需要将encoder_factory
传递给您的注册表。
稍后,setConfirmPassword()
来电完成后,验证将会运行,如果密码匹配,则运行正确
那么,这就是你想要做的事吗? :)
P.S。请原谅我可能出现的错误,我正在输入这个记事本++ ...
答案 1 :(得分:0)
对于使用FOS_user的用户,我通过对属性plainPassword进行比较来解决了类似的问题。
取自Symfony tutorial。
<code>
/**
* @Assert\EqualTo(propertyPath="plainPassword")
*/
protected $confirmPassword;
</code>