2011-11-07 16 views
9

私は、私が試してみて、フォームにsymfonyの2埋め込みフォーム

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

を要求をバインドするときしかし、私はエラー

を取得するので、

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

のような別の形の型にフォームタイプを埋め込むています

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フォームがビルドされ、ページ上に正常に表示されますが、このエラーが発生したときにフォームがポストされ、ユーザーオブジェクトのバインダーが表示されるため、私はそうは思わない。 – Daniel

答えて

8

あなたのAParentTypeフォームでデータクラスを設定していません。 symfonyのそれ以降のバージョンの

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

、あなたの代わりにこれを使用する必要があります:あなたはこのようなことを行う。これにより

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

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

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

はこれを交換してください

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

すでにt彼は名前空間です。

そして、それはそれはあなたが、あなたのフォームテンプレートで、ある、一対一だ場合:動作するはず

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

うまくいけば。あなたのエンティティ定義はうまく見えます:-)

+0

それは働いた!どうもありがとうございます!私はその方法を忘れてしまったと信じられません。 – Daniel

+1

あなたは歓迎です:-)あなたの夜の残りをお楽しみください。 – Flukey

+1

3年後にこの問題に陥ってしまいました。オリジナルのソリューションは効果がありませんでしたが、 'setDefaultOptions'を' OptionsResolverInterface'を使って完全に動作させました。私はあなたのソリューションにそれを加えました。 – sjagr

関連する問題