Symfony 2 Embedded Forms

12,016

You haven't set the data class in your AParentType form. You do that like this:

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

For later versions of Symfony, you'll need to use this instead:

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

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

Replace this:

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

With this:

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

because you've already included the namespace.

And if it's one-to-one, which it is, in your form template, you do:

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

Hopefully that should work. Your entity definitions look fine :-)

Share:
12,016
Daniel
Author by

Daniel

Updated on July 25, 2022

Comments

  • Daniel
    Daniel almost 2 years

    I am embedding a form type into another form type like so

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

    However when I try and bind the request to the form

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

    I get the error

    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

    It seems like the form is passing the "AParent" object as an array instead of as an entity. Any ideas?

    Edited

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

    AParentType.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';
            }
        }