2011-11-07 3 views
9

나는 그렇게심포니이 포함 된 양식

$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 양식이 빌드되어 페이지에 잘 표시되기 때문에 폼이 게시되고이 오류가 발생할 때 사용자 개체에 바인더가있을 때 나는 그렇게 생각하지 않습니다. – Daniel

답변

8

귀하의 AParentType 양식에 데이터 클래스를 설정하지 않았습니다. 심포니 이후 버전

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 년 후이 문제가 발생했습니다.원래의 솔루션은 효과가 없었지만'OptionsResolverInterface'가 완벽하게 작동하는'setDefaultOptions'를 사용했습니다. 솔루션에 추가했습니다. – sjagr

관련 문제