[英]Symfony2 implement a form for OneToOne relation
我正在尝试实现一对一的关系。 每个用户都可能受到建筑物的影响(对我来说是可行的)。 一栋建筑物可以有很多人,但每个人最多只能在一栋建筑物上受到影响。
我有这个错误:
ContextErrorException:可捕获的致命错误:传递给Intranet \\ UserBundle \\ Entity \\ User :: setUserEtab()的参数1必须是Intranet \\ RhBundle \\ Entity \\ Etablissement的实例,给定的数组在C:\\ wamp \\ www \\ projet \\ vendor中调用\\ symfony \\ symfony \\ src \\ Symfony \\ Component \\ PropertyAccess \\ PropertyAccessor.php行360,并在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;
窗体的视图还可以,有一个包含所有建筑物的选择列表,并且有一个空值。 但是当我发帖时,我遇到了我无法理解和解决的错误。
我有二传手和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()
而且该建筑物不会出现在$request->get('user')
var_dump
中。
编辑:
我的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:
namespace Intranet\UserBundle\Form\Type;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class UserEtabType extends AbstractType
{
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))
;
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array('data_class' => 'Intranet\UserBundle\Entity\User'));
}
public function getName()
{
return 'intranet_userbundle_useretablissementtype';
}
}
您可以显示新的UserEtabType()类吗?
编辑1 :尝试将这一行:
->add('etablissement', 'entity', array('class' => 'IntranetRhBundle:Etablissement', 'property' => 'nom', 'empty_value' => 'Aucun', 'empty_data' => -1, 'required' => false));
在主EditForm中
编辑2 :另外要小心:
$resolver->setDefaults(array('data_class' => 'Intranet\UserBundle\Entity\User'));
一定是
$resolver->setDefaults(array('data_class' => 'Intranet\UserBundle\Entity\Etablissement'));
在您的UserEtabType()
类中
尝试插入记录时出现此错误吗? 或者在那之前。 就您的信息而言,由于一对一关系,User实体中的setUserEtab()需要一个Etablissement对象。 传递数组的值是不够的。 尝试自行传递Etablissement对象(执行dql之后选择的对象)。
希望这对某人有帮助。
干杯!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.