Php Symfony 2嵌入式表单

Php Symfony 2嵌入式表单,php,forms,symfony,symfony-forms,Php,Forms,Symfony,Symfony Forms,我将一个表单类型嵌入到另一个表单类型中,如下所示 $builder->add('parent', new \Company\Bundle\Form\UserObjects\AParentType); 但是,当我尝试将请求绑定到表单时 if($request->getMethod() == 'POST') { $form->bindRequest($request); } 我得到了错误 可捕获的致命错误:传递给Company\Bundle\Entity\UserO

我将一个表单类型嵌入到另一个表单类型中,如下所示

$builder->add('parent', new \Company\Bundle\Form\UserObjects\AParentType);
但是,当我尝试将请求绑定到表单时

if($request->getMethod() == 'POST') {
      $form->bindRequest($request);
}
我得到了错误

可捕获的致命错误:传递给Company\Bundle\Entity\UserObjects\User::setParent()的参数1必须是Company\Bundle\Entity\UserObjects\AParent的实例,数组给定,在第346行的/Volumes/Media/Symfony/vendor/Symfony/src/Symfony/Component/Form/Util/PropertyPath.php中调用,并在第771行的/Volumes/Media/Symfony/src/Company/Bundle/Entity/UserObjects/User.php中定义

表单似乎将“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()
        {
        }

    }

您尚未在AParentType表单中设置数据类。你是这样做的:

public function getDefaultOptions(array $options)
{
    return array(
        'data_class' => 'Project\MyBundle\Entity\AParent',
    );
}
对于Symfony的更高版本,您需要使用以下选项:

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());
因为您已经包含了名称空间

如果在表单模板中是一对一的,您可以:

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

希望这能奏效。您的实体定义看起来不错:-)

在您的第一个代码段中,类名后面的括号不是必须的吗?如果您能看到更多的代码,这也会很有帮助。这并不能告诉我们太多。@greg0ire我不这么认为,因为表单在页面上构建和显示得很好,但当表单发布并绑定到用户对象时,就是发生此错误的时候。@Jamie您还想看到什么,实际上没有那么多,我现在也不在计算机旁处理代码。您的实体定义和表单类。看起来关系有点问题,这很有效!非常感谢你!真不敢相信我竟然忘了那个方法,它现在有这么多意义!三年多后遇到这个问题哈!!最初的解决方案无效,但将
setDefaultOptions
选项resolvernterface
配合使用效果很好。我已将其添加到您的解决方案中。
->add('parent', new \Company\Bundle\Form\UserObjects\AParentType);
->add('parent', new AParentType());
{{ form_row(form.parent.zipCode) }}