我正在尝试实现一对一的关系。每个用户都可能在建筑物中受到影响(对我来说是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')
答案 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后选择的对象)。
希望这有助于某人。
干杯!