如何访问一对一嵌入式表单symfony2

如何访问一对一嵌入式表单symfony2,symfony,doctrine-orm,Symfony,Doctrine Orm,我只用了几天的时间就使用了symfony 2。 我有两个实体,我想创建一个表单,并将此表单中的数据保存到数据库中。 用户详细信息和合同有关系。 我在UserDetails表单(web上的表单apper)中嵌入了一个合同表单,但当我在表单中设置一些数据并单击“保存”按钮时,我得到了一个错误。当我注意到“尝试”分配数组而不是契约时,我不知道如何访问Controller中的这个新契约entite 示例错误: ContextErrorException:可捕获的致命错误:传递给Leave\Databas

我只用了几天的时间就使用了symfony 2。 我有两个实体,我想创建一个表单,并将此表单中的数据保存到数据库中。 用户详细信息和合同有关系。 我在UserDetails表单(web上的表单apper)中嵌入了一个合同表单,但当我在表单中设置一些数据并单击“保存”按钮时,我得到了一个错误。当我注意到“尝试”分配数组而不是契约时,我不知道如何访问Controller中的这个新契约entite

示例错误:

ContextErrorException:可捕获的致命错误:传递给Leave\DatabaseBundle\Entity\UserDetails::setContract()的参数1必须是Leave\DatabaseBundle\Entity\Contract的实例,给定数组,在第360行的/var/www/nowyUrlop/vendor/symfony/src/symfony/Component/PropertyAccess/PropertyAccessor.php中调用,并在/var/www/nowyUrlop/src/Leave/DatabaseBundle/Entity/UserDetails.php第165行中定义

在/var/www/nowyUrlop/vendor/symfony/symfony/src/symfony/Component/PropertyAccess/PropertyAccessor.php第360行的UserDetails->setContract(数组('start\u control'=>object(DateTime),'end\u control'=>object(DateTime),'hours\u per\u week'=>'6'))

用户详细信息实体:

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Annotations\AnnotationReader;
use Leave\DatabaseBundle\Entity\User;

/**
 * @ORM\Entity
 * @ORM\Table(name="userDetails")
 */
class UserDetails {

/**
 * @ORM\Id
 * @ORM\Column(type="integer")
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected $id;

/**
 * @ORM\OneToOne(targetEntity="Contract", mappedBy="user_details", cascade={"persist"})
 */
protected $contract;

/**
 * @ORM\OneToOne(targetEntity="User", inversedBy="userDetails")
 * @ORM\JoinColumn(name="user_id", nullable = true, referencedColumnName="id")
 * */
protected $user;
合同实体:

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * @ORM\Entity
 * @ORM\Table(name="contract")
 */
class Contract {

/**
 * @ORM\Id
 * @ORM\Column(type="integer")
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected $id;

/**
 * @ORM\Column(type="date")
 */
protected $start_contr;

/**
 * @ORM\Column(type="date")
 */
protected $end_contr;

/**
 * @ORM\Column(type="integer")
 */
protected $type ;

/**
 * @ORM\Column(type="integer")
 */
protected $hours_per_week;

/**
 * @ORM\OneToOne(targetEntity="UserDetails", inversedBy="contract")
 * @ORM\JoinColumn(name="user_details_id", nullable = true, referencedColumnName="id")
 * */
protected $user_details;

public function setUserDetails(\Leave\DatabaseBundle\Entity\UserDetails $userDetails = null)
{
    $this->user_details = $userDetails;

    return $this;
}

/**
 * Get user_details
 *
 * @return \Leave\DatabaseBundle\Entity\UserDetails 
 */
public function getUserDetails()
{
    return $this->user_details;
}
用户详细信息表格:

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Leave\DatabaseBundle\Form\Type\ContractFormType;

class UserDetailsFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('exp', 'text')
        ->add('total_leave', 'text')
        ->add('days_left', 'text')
        ->add('contract', new contractFormType())
        ->add('save', 'submit');
    }

    public function getName()
    {
        return 'userDetails';
    }
}
合同格式:

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;

class ContractFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('start_contr', 'date', array('widget' => 'single_text'))
        ->add('end_contr', 'date', array('widget' => 'single_text'))
        ->add('hours_per_week', 'text');
}   

public function getName()
{
    return 'contractForm';
}
}
控制器:

 public function editUserAction(Request $request) {

    $user = $this->get('security.context')->getToken()->getUser();
    $userDetails = new UserDetails();
    $form = $this->createForm(new UserDetailsFormType(), $userDetails);
    $userDetails->setUser($user);

    $form->handleRequest($request);

    if ($form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $em->persist($userDetails);
        $em->flush();

        return $this->render('LeaveEmployeeBundle:Employee:editUser.html.twig', array(
                    'formEditUser' => $form->createView(),
                    'userDetails' => $userDetails,
                    'user' => $user
            ));
    }
    return $this->render('LeaveEmployeeBundle:Employee:editUser.html.twig', array(
                'formEditUser' => $form->createView()
    ));
}

您必须将data_类作为第二个参数传递

在UserDetals表单中:执行以下操作

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Leave\DatabaseBundle\Form\Type\ContractFormType;

class UserDetailsFormType extends AbstractType
{
   public function buildForm(FormBuilderInterface $builder, array $options)
   {
       $builder->add('exp', 'text')
       ->add('total_leave', 'text')
       ->add('days_left', 'text')
       ->add('contract', new contractFormType(), array(
        'data_class' => 'Leave\DatabaseBundle\Entity\Contract')
       )
       ->add('save', 'submit');
   }

   public function getName()
   {
      return 'userDetails';
   }
}

类名区分大小写。表单类中有
contractFormType())
。请尝试
ContractFormType())
。没有区别,我的表单渲染正确,但当我单击表单上的“保存”按钮时出现问题。但是回答是thx所以这一行
->add('contract',new contractFormType())
现在读起来不同了?当我把它改为->add('contract',new contractFormType())时没有什么不同。在我的例子中,我得到了一个正确的被篡改的表单,但当我填写所有行并单击save时,我得到了上面描述的错误。可能我试图向函数“setContract”传递一个数组,而不是一个“Contract”对象。我不知道如何强制我的应用程序将部分数据保存到UserDetails对象和Contract对象