Symfony2为OneToOne关系实现一个表单

时间:2014-05-22 07:12:06

标签: php forms symfony doctrine-orm

我正在尝试实现一对一的关系。每个用户都可能在建筑物中受到影响(对我来说是Etablissement)。建筑物可以有很多人,但每个人最多只能在一栋建筑物上受到影响。

我有这个错误:

  

ContextErrorException:Catchable Fatal Error:传递给Intranet \ UserBundle \ Entity \ User :: setUserEtab()的参数1必须是给定的Intranet \ RhBundle \ Entity \ Etablissement实例,在C:\ wamp \ www \中调用第360行的projet \ vendor \ symfony \ symfony \ src \ Symfony \ Component \ PropertyAccess \ PropertyAccessor.php,在C:\ wamp \ www \ projet \ src \ Intranet \ UserBundle \ Entity \ User.php第322行中定义

User.php的第322行是:

public function setEtablissement(\Intranet\RhBundle\Entity\Etablissement $etablissement = null)

它出现在我的控制器的$form->handleRequest($request);行。这是我的控制者:

public function editerAction(Request $request, User $user){
    $form = $this->createForm(new EditerFormType, $user);
    if ($request->getMethod() == 'POST') {
        $form->handleRequest($request);
        die("ici");
        if ($form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->persist($user);
            $this->get('session')->getFlashBag()->add('success', "L'utilisateur ". $user->getNom() ." ". $user->getPrenom() . " a été édité avec succès !");
            $em->flush();
            return $this->redirect($this->generateUrl('intranet_rh_homepage'));
        }else
            $this->get('session')->getFlashBag()->add('danger', "Erreur de formulaire !");  
    }
    return $this->render('IntranetRhBundle:User:editer.html.twig',array('user' => $user, 'form' => $form->createView()));
}

骰子不起作用。在添加表单之前,它正在运行。

这是EditForm:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('email', 'email', array('label' => 'form.email', 'translation_domain' => 'FOSUserBundle')) 
        ->add('nom', 'text')
        ->add('prenom', 'text')
        ->add('naissance','date',array(
        'widget' => 'single_text',
        'format' => 'dd/MM/yyyy',
        'attr' => array('class' => 'date', 'readonly' => 'readonly')
        ))
        ->add('sexe', 'choice', array(
         'choices' => array('Homme' => 'Homme', 'Femme' => 'Femme'),
         'multiple' => false
        ))
        ->add('etablissement', new UserEtabType())
    ;
}

public function setDefaultOptions(OptionsResolverInterface  $resolver)
{
    $resolver->setDefaults(array('data_class' => 'Intranet\Userbundle\Entity\User'));
}

这是我的UserEtab表单:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
    ->add('etablissement', 'entity', array('class' => 'IntranetRhBundle:Etablissement', 'property' => 'nom', 'empty_value' => 'Aucun', 'empty_data'  => -1, 'required' => false))
    ;
}

我与用户实体的关系:

    /**
* @ORM\OneToOne(targetEntity="Intranet\RhBundle\Entity\Etablissement", cascade={"persist", "remove"})
**/
private $etablissement;

表单的视图没问题,有一个包含所有建筑物和空值的选择列表。但是当我发帖时,我有这个错误,我无法理解和解决。

如果用户实体:

,我有setter和getter
    /**
 * Set Etablissement
 *
 * @param \Intranet\RhBundle\EntityEtablissement $etablissement
 * @return User
 */
public function setEtablissement(\Intranet\RhBundle\Entity\Etablissement $etablissement = null)
{
    $this->etablissement = $etablissement;

    return $this;
}

/**
 * Get Etablissement
 *
 * @return \Intranet\RhBundle\Entity\Etablissement 
 */
public function getEtablissement()
{
    return $this->etablissement;
}

但是当我var_dump $request->get('user')->get('etablissement')时它不起作用:

  

错误:在C:\ wamp \ www \ projet \ src \ Intranet \ RhBundle \ Controller \ UserController.php第69行中调用未定义的方法Intranet \ UserBundle \ Entity \ User :: get()

该建筑没有出现在var_dump的{​​{1}}。

编辑:

我的UserEtabType没有setDefaultOptions方法,因为我不知道自己要做什么。我试图实现它,但我有这样的错误:

  

表单的视图数据应该是Intranet \ UserBundle \ Entity \ User类的实例,但是是类Proxies__CG __ \ Intranet \ RhBundle \ Entity \ Etablissement的实例。您可以通过将“data_class”选项设置为null或通过添加将类Proxies__CG __ \ Intranet \ RhBundle \ Entity \ Etablissement的实例转换为Intranet \ UserBundle \ Entity \ User实例的视图转换器来避免此错误。

对于新的UserEtabType:

$request->get('user')

2 个答案:

答案 0 :(得分:2)

你能展示新的UserEtabType()类吗?

编辑1 :尝试使用此行:

->add('etablissement', 'entity', array('class' => 'IntranetRhBundle:Etablissement', 'property' => 'nom', 'empty_value' => 'Aucun', 'empty_data' => -1, 'required' => false));
主编辑

中的

编辑2 : 另外要小心:

$resolver->setDefaults(array('data_class' => 'Intranet\UserBundle\Entity\User'));

必须是

$resolver->setDefaults(array('data_class' => 'Intranet\UserBundle\Entity\Etablissement'));

在您的UserEtabType()班级

答案 1 :(得分:0)

尝试插入记录时是否收到此错误?或者之前。为了您的信息,由于一对一的关系,User实体中的setUserEtab()需要Etablissement的对象。传递数组的值是不够的。尝试传递Etablissement的对象(执行dql后选择的对象)。

希望这有助于某人。

干杯!