2011-11-07 22 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

ऐसा लगता है कि फ़ॉर्म "एपेंट" ऑब्जेक्ट को एक इकाई के बजाए सरणी के रूप में पास कर रहा है। कोई विचार?

संपादित

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

आपने अपने एपेंट टाइप प्रकार में डेटा क्लास सेट नहीं किया है।

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

Symfony के बाद के संस्करणों के लिए, आप के बजाय इस का उपयोग करना होगा: आपको लगता है कि इस तरह से करना

->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()); 

क्योंकि आप पहले से ही टी शामिल कर चुके हैं वह नामस्थान।

और अगर यह एक-से-एक है, जो इसे अपने प्रपत्र टेम्पलेट में है, है, तो आप कार्य करें:

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

उम्मीद है कि है कि काम करना चाहिए। आपकी इकाई परिभाषाएं ठीक दिखती हैं :-)

+0

यह काम किया! आपको बहुत - बहुत धन्यवाद! विश्वास नहीं कर सकता कि मैं उस पद्धति को भूल गया था, अब यह इतना समझ में आता है! – Daniel

+1

आपका स्वागत है :-) अपनी शेष शाम का आनंद लें। – Flukey

+1

3 साल बाद इस समस्या में भागो, हे!मूल समाधान अप्रभावी था लेकिन 'OptionsDesolverInterface' के साथ' setDefaultOptions' का उपयोग करके पूरी तरह से काम किया। मैंने इसे आपके समाधान में जोड़ा है। – sjagr

संबंधित मुद्दे