2011-11-07 59 views
9

我嵌入表單類型到另一種形式的類型,像這樣Symfony的2嵌入表單

$builder->add('parent', new \Company\Bundle\Form\UserObjects\AParentType); 

然而,當我嘗試和要求綁定到窗體

if($request->getMethod() == 'POST') { 
     $form->bindRequest($request); 
} 

我得到的錯誤

Catchable Fatal Error: Argument 1 passed to Company\Bundle\Entity\UserObjects\User::setParent() must be an instance of Company\Bundle\Entity\UserObjects\AParent, array given, called in /Volumes/Media/Symfony/vendor/symfony/src/Symfony/Component/Form/Util/PropertyPath.php on line 346 and defined in /Volumes/Media/Symfony/src/Company/Bundle/Entity/UserObjects/User.php line 771

好像形式使「AParent」對象作爲陣列而不是作爲一個實體。有任何想法嗎?

被修改

user.php的

<?php 
    // src/Company/Bundle/Entity/UserObjects/Users.php 

    namespace Company\Bundle\Entity\UserObjects; 

    use Symfony\Component\Security\Core\User\UserInterface; 

    use Doctrine\ORM\Mapping as ORM; 

    /** 
    * @ORM\Entity(repositoryClass="Company\Bundle\Repository\UserObjects\UserRepository") 
    * @ORM\Table(name="user") 
    * @ORM\HasLifecycleCallbacks() 
    */ 
    class User implements UserInterface, \Serializable 
    { 
     /** 
     * @ORM\Id 
     * @ORM\Column(type="integer") 
     * @ORM\GeneratedValue(strategy="AUTO") 
     */ 
     protected $id; 

     /** 
     * @ORM\Column(type="string") 
     */ 
     protected $username; 

     /** 
     * @ORM\Column(type="string") 
     */ 
     protected $password; 

     /** 
     * @ORM\Column(type="string") 
     */ 
     protected $securityQuestion; 

     /** 
     * @ORM\Column(type="string") 
     */ 
     protected $securityAnswer; 

     /** 
     * @ORM\Column(type="string") 
     */ 
     protected $salt; 


     /** 
     * @ORM\OneToOne(targetEntity="AParent", inversedBy="user") 
     */ 
     private $parent; 







     public function serialize() 
     { 
      return serialize(array( 
       'username' => $this->getUsername(), 
       'password' => $this->getPassword(), 
       'salt'  => $this->getSalt(), 
       'roles'  => $this->getRoles(), 
      )); 
     } 

     public function unserialize($serializedData) 
     { 
      $unserializedData  = unserialize($serializedData); 

      $this->setUsername(isset($unserializedData['username']) ? $unserializedData['username'] : null); 
      $this->setPassword(isset($unserializedData['password']) ? $unserializedData['password'] : null); 
      $this->setSalt(isset($unserializedData['salt']) ? $unserializedData['salt'] : null); 
     } 

     public function getRoles() 
     { 
      return array('ROLE_USER'); 
     } 




     public function eraseCredentials() 
     { 
      return false; 
     } 

     public function equals(UserInterface $user) 
     { 
       if ($user->getUsername() != $this->getUsername()) { 
        return false; 
       } 
       if ($user->getEmail() != $this->getEmail()) { 
        return false; 
       } 
       return true; 
     } 

     /** 
     * Get password 
     * 
     * @return string 
     */ 
     public function getPassword() 
     { 
      return $this->password; 
     } 

     /** 
     * Get salt 
     * 
     * @return string 
     */ 
     public function getSalt() 
     { 
      return $this->salt; 
     } 

     public function getUsername() 
     { 
      return $this->username; 
     } 

     /** 
     * Get id 
     * 
     * @return integer 
     */ 
     public function getId() 
     { 
      return $this->id; 
     } 

     /** 
     * Set username 
     * 
     * @param string $username 
     */ 
     public function setUsername($username) 
     { 
      $this->username = $username; 
     } 

     /** 
     * Set password 
     * 
     * @param string $password 
     */ 
     public function setPassword($password) 
     { 
      $this->password = $password; 
     } 

     /** 
     * Set securityQuestion 
     * 
     * @param string $securityQuestion 
     */ 
     public function setSecurityQuestion($securityQuestion) 
     { 
      $this->securityQuestion = $securityQuestion; 
     } 

     /** 
     * Get securityQuestion 
     * 
     * @return string 
     */ 
     public function getSecurityQuestion() 
     { 
      return $this->securityQuestion; 
     } 

     /** 
     * Set securityAnswer 
     * 
     * @param string $securityAnswer 
     */ 
     public function setSecurityAnswer($securityAnswer) 
     { 
      $this->securityAnswer = $securityAnswer; 
     } 

     /** 
     * Get securityAnswer 
     * 
     * @return string 
     */ 
     public function getSecurityAnswer() 
     { 
      return $this->securityAnswer; 
     } 

     /** 
     * Set salt 
     * 
     * @param string $salt 
     */ 
     public function setSalt($salt) 
     { 
      $this->salt = $salt; 
     } 




     /** 
     * Set parent 
     * 
     * @param Company\Bundle\Entity\UserObjects\AParent $parent 
     */ 
     public function setParent(\DABSquared\ProjectGradesBundle\Entity\UserObjects\AParent $parent) 
     { 
      $this->parent = $parent; 
      if($parent != null) { 
       $parent->setUser($this); 
      } 
     } 

     /** 
     * Get parent 
     * 
     * @return Company\Bundle\Entity\UserObjects\AParent 
     */ 
     public function getParent() 
     { 
      return $this->parent; 
     } 


     } 
     public function __construct() 
     { 
     } 

    } 

AParent.php

<?php 
    // src/Company/Bundle/Entity/UserObjects/AParent.php 

    namespace Company\Bundle\Entity\UserObjects; 

    use Doctrine\ORM\Mapping as ORM; 



    /** 
    * @ORM\Entity(repositoryClass="Company\Bundle\Repository\UserObjects\AParentRepository") 
    * @ORM\Table(name="parents") 
    * @ORM\HasLifecycleCallbacks() 
    */ 
    class AParent 
    { 
     /** 
     * @ORM\Id 
     * @ORM\Column(type="integer") 
     * @ORM\GeneratedValue(strategy="AUTO") 
     */ 
     protected $id; 


     /** 
     * @ORM\OneToOne(targetEntity="User", inversedBy="parent") 
     */ 
     private $user; 

        /** 
        * @ORM\Column(type="string") 
        */ 
        protected $zipCode; 


     public function __construct() 
     { 

     } 

     /** 
     * Get id 
     * 
     * @return integer 
     */ 
     public function getId() 
     { 
      return $this->id; 
     } 

     /** 
     * Set user 
     * 
     * @param Company\Bundle\Entity\UserObjects\User $user 
     */ 
     public function setUser(\Company\Bundle\Entity\UserObjects\User $user) 
     { 
      $this->user = $user; 
     } 

     /** 
     * Get user 
     * 
     * @return Company\Bundle\Entity\UserObjects\User 
     */ 
     public function getUser() 
     { 
      return $this->user; 
     } 

        /** 
     * Set zipCode 
     * 
     * @param string $zipCode 
     */ 
     public function setZipCode($zipCode) 
     { 
      $this->zipCode = $zipCode; 
     } 

     /** 
     * Get zipCode 
     * 
     * @return string 
     */ 
     public function getZipCode() 
     { 
      return $this->zipCode; 
     } 



    } 

UserType.php

<?php 

    namespace Company\Bundle\Form; 

    use Symfony\Component\Form\AbstractType; 
    use Symfony\Component\Form\FormBuilder; 

    use Doctrine\ORM\EntityRepository; 

    class UserType extends AbstractType 
    { 
     public function buildForm(FormBuilder $builder, array $options) 
     { 
      $builder 
       ->add('username',null,array('label' => 'Username:')) 
       ->add('password',null,array('label' => 'Password:')) 
       ->add('securityQuestion',null,array('label' => 'Security Question:')) 
       ->add('securityAnswer',null,array('label' => 'Security Answer:')) 
       ->add('parent', new \Company\Bundle\Form\UserObjects\AParentType); 

     } 

     public function getName() 
     { 
      return 'usertype'; 
     } 
    } 

AParent Type.php

<?php 

    namespace Company\Bundle\Form\UserObjects; 

    use Symfony\Component\Form\AbstractType; 
    use Symfony\Component\Form\FormBuilder; 

    class AParentType extends AbstractType 
    { 
     public function buildForm(FormBuilder $builder, array $options) 
     { 
      $builder 
       ->add('zipCode',null,array('label' => 'Zip Code:')); 
     } 

     public function getName() 
     { 
      return 'aparenttype'; 
     } 
    } 
+0

不是類名強制後的括號,你的第一個代碼片段? – greg0ire

+0

看到更多的代碼也會有所幫助。這並沒有告訴我們很多。 – Flukey

+0

@ greg0ire我不這麼認爲,因爲表單在頁面上生成並顯示正常,但是當表單發佈並粘貼到User對象時發生此錯誤時。 – Daniel

回答

8

您尚未在您的AParentType表單中設置數據類。你是這樣做的:

public function getDefaultOptions(array $options) 
{ 
    return array(
     'data_class' => 'Project\MyBundle\Entity\AParent', 
    ); 
} 

爲symfony1.2的後續版本,你需要使用它代替:

use Symfony\Component\OptionsResolver\OptionsResolverInterface; 
//... 

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => 'Project\MyBundle\Entity\AParent', 
    )); 
} 

替換此:

->add('parent', new \Company\Bundle\Form\UserObjects\AParentType); 

有了這個:

->add('parent', new AParentType()); 

,因爲你已經包括贈送T他命名空間。

如果這是一個對一個,它是在你的表單模板,你這樣做:

{{ form_row(form.parent.zipCode) }} 

希望這應該工作。你的實體定義看起來不錯:-)

+0

工作正常!非常感謝!不能相信我忘記了這種方法,現在它變得非常有意義! – Daniel

+1

不客氣:-)享受你晚上的其餘時間。 – Flukey

+1

3年後出現這個問題,哈!最初的解決方案是無效的,但使用'OptionsResolverInterface'的'setDefaultOptions'完美運行。我已將它添加到您的解決方案中。 – sjagr