我正在使用Form类来帮助生成表单。这是一个密码重置表格。
此表单需要绑定到我的用户实体,一旦提交表单,密码将被更新。
一切都在使用我当前拥有的代码,但是试图剥离一些我认为不需要的代码(由于使用了data_class选项),我的验证失败了(因为表单似乎变得“分离”了)形成实体)
好,所以一些代码:
public function passwordResetAction(Request $request, $key = NULL)
{
$user = $this->getDoctrine()
->getRepository('DemoUserBundle:User\User')
->findOneBy(array('resetToken' => $key));
if (!$user) {
throw $this->createNotFoundException('No user found for reset token '.$key.'!');
}
$form = $this->createForm(new PasswordResetType(), $user);
if ($request->getMethod() == 'POST') {
$form->bindRequest($request);
if ($form->isValid()) {
$postData = $request->request->get('resetpass');
$newPassword = $postData['password'];
$encoder = new MessageDigestPasswordEncoder('sha1', false, 1);
$password = $encoder->encodePassword($newPassword, $user->getSalt());
$user->setPassword($password);
$newToken = base64_encode($user->getUsername().'|'.date('Y-m-d'));
$user->setResetToken($newToken);
$em = $this->getDoctrine()->getEntityManager();
$em->persist($user);
$em->flush();
return $this->redirect($this->generateUrl('password_reset_success'));
}
}
return $this->render('DemoUserBundle:User\Reset:password-reset.html.twig', array('key' => $key, 'form' => $form->createView()));
}
我感兴趣的代码是“ $ form = $ this-> createForm(new PasswordResetType(),$ user);”如您所见,我正在使用“表单类型”来构造表单,并向其传递将表单附加到User实体的$ user变量。现在,据我所知,我不需要此参数集,因为我在“表单类型”中设置了实体(请参见下面的代码)
namespace Demo\UserBundle\Form\Type\User;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
use Symfony\Component\Form\FormError;
use Symfony\Component\Form\CallbackValidator;
class PasswordResetType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
$builder->add('password', 'password', array('label' => 'New Password'));
$builder->add('confirmPassword', 'password', 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' => 'Demo\UserBundle\Entity\User\User',
);
}
public function getName()
{
return 'resetpass';
}
}
因此,此表单应默认附加到用户实体(不需要$ user变量),但不起作用。如果没有传递该变量,则验证就根本行不通(表明它没有被附加到用户实体)
什么给了?大家有什么想法吗?
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Demo\UserBundle\Entity\User\User',
));
}
Symfony 2.7的注意事项:表单API稍有更改,因此您应该改用它:
public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults(array( 'data_class' => 'Demo\UserBundle\Entity\User\User', )); }