Symfony2 - 表单类:data_class似乎不起作用

时间:2012-04-11 13:35:07

标签: php symfony

我正在使用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变量)但它不起作用。如果没有传递该变量,验证就不起作用(指示它没有附加到用户实体)

是什么给出的?有什么想法吗?

2 个答案:

答案 0 :(得分:0)

data_class选项用于设置表单使用的相应数据映射器。如果你不提供它,它会根据你传递给它的对象来猜测它。

它不会让您将对象传递给表单。您认为它如何知道您想要使用哪个对象?

答案 1 :(得分:0)

新的symfony版本中的

使用另一种方法签名(选项解析器而不是$ options变量):

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',
    ));
}