Symfony2实现了OneToOne关系的表单


Symfony2 implement a form for OneToOne relation

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

我有这个错误:

contextroreexception: Catchable Fatal Error:参数1传递给Intranet'UserBundle'Entity'User::setUserEtab()必须是Intranet'RhBundle'Entity' etabisement的一个实例,数组给定,在C:'wamp'www' project 'vendor'symfony'symfony'src' symfony' Component'PropertyAccess'PropertyAccessor.php中360行调用,并在C:'wamp'www' project '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'));
}

这是我的usertab表单:

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))
    ;
}

And my relation on User entity:

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

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

我有setter和getter如果User entity:

    /**
 * 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')它不工作:

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

$request->get('user')var_dump中没有出现该建筑。

编辑:

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

表单的视图数据应该是类Intranet'UserBundle'Entity'User的一个实例,但是它是类proxes__cg__ 'Intranet'RhBundle'Entity'Etablissement的一个实例。您可以通过将"data_class"选项设置为null或添加一个视图转换器来避免此错误,该视图转换器将类proxes__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()类吗?

EDIT 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()需要一个etablisement对象。传递数组的值是不够的。尝试将创建的对象传递给它自己(执行dql后选择的对象)。

希望这能帮助到一些人。

干杯!