2012-04-11 63 views
0

我使用Form類來幫助生成表單的工作。這是一個密碼重置表單。的Symfony2 - Form類:data_class似乎並不

這種形式需要被捆綁到我的用戶實體,一旦表單提交密碼將被更新。

一切都與我目前的代碼一起工作,但試圖去掉一些我認爲不應該要求的代碼(由於使用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())); 
} 

的一塊,我很感興趣,代碼爲」 $形式= $這個 - >的CreateForm(新PasswordResetType(),$用戶);」正如你所看到的,我使用表單類型來構造表單並傳遞給用戶實體的$ 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變量),但它不起作用。如果沒有通過該變量,驗證根本無效(指示它未附加到用戶實體)

什麼給出了?任何想法的人?

回答

0

data_class選項用於設置爲由形式使用適當的數據映射器。如果你不提供它,它會根據你傳遞給它的對象來猜測它。

它不會傳遞對象到窗體中解脫出來。你如何認爲它會知道你想使用哪個對象?

在新的symfony版本
+0

啊,所以我誤解了這些信息?這是一個可選的選項,不允許我不使用$ user變量?如果我不指定它,可能會出現什麼問題? – 2012-04-11 14:25:05

+0

在做嵌入式表單時,Symfony可能會自動推斷數據類。這個選項幫助它。 – 2012-04-11 14:29:10

0

使用另一種方法簽名(選項解析器來代替$選項變量):

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