bug sur la vue d'un formulaire OneToMany

Par zikou23, il y a 10 ans


bonjour,
j'ai un problème sur l'affichage de mon formulaire de type OneToMany qui me retour ceci:
The form's view data is expected to be an instance of class
BackOffice\Model\UserInfo, but is an instance of class Doctrine\Common\Collections\ArrayCollection. You can avoid this error by setting the "data_class" option to null or by adding a view transformer that transforms an instance of class Doctrine\Common\Collections\ArrayCollection to an instance of BackOffice\Model\UserInfo

et si j'enlève le changement type de UserInfo dans ma classe User::__construct
ça me renvoi ceci

Neither the property "UserInfo" nor one of the methods "setUserInfo()", "set()" or "call()" exist and have public access in class "Proxies__CG__\VS\UserBundle\Entity\Description".
voici mes codes:

//le formulaire User namespace BackOffice\Formulaire; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormEvent; use Symfony\Component\Form\FormEvents; use Symfony\Component\OptionsResolver\OptionsResolverInterface; use BackOffice\Formulaire\UserInfoType; class UserType extends AbstractType{ /*..*/ public function builder(FormBuilderInterface $builder, array $options){ $builder->add('UserInfo',new UserInfoType); } public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'data_class' => 'BackOffice\Model\User' )); } } //le formulaire UserInfo namespace BackOffice\Formulaire; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormEvent; use Symfony\Component\Form\FormEvents; use Symfony\Component\OptionsResolver\OptionsResolverInterface; use BackOffice\Formulaire\UserInfoType; class UserInfoType extends AbstractType{ public function builder(FormBuilderInterface $builder, array $options){ $builder->add('adr1','text',array('attr'=>array('placeholder'=>'adresse1'))); } public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'data_class' => 'BackOffice\Model\UserInfo' )); } } //le model User namespace BackOffice\Model; use Symfony\Component\Security\Core\User\UserInterface; use UserInfo; class User extends UserInterface{ /*.autre attribut.*/ /** *@ORM\OneToMany(targetEntity="UserInfo", mappedBy="user", cascade={"persist"}) *@ORM\JoinColumn(nullable=false) */ private $UserInfo; public function __construct(){ $this->UserInfo = new \Doctrine\Common\Collections\ArrayCollection(); } public function addUserInfo(UserInfo $userinfo){ $this->UserInfo[] = $userinfo; return $this; } public function removeUserInfo(UserInfo $userinfo){ $this->UserInfo->removeElement($userinfo); return $this; } public function getUserInfo(){ return $this->UserInfo; } } //le modèle UserInfo: namespace BackOffice\Model; use User; class UserInfo{ /*.autre attribut.*/ /** *@ORM\ManyToOne(targetEntity="User", inversedBy="UserInfo", cascade={"persist"}) *@ORM\JoinColumn(nullable=false) */ private $user; public function setUser(User $user){ $this->user = $user; } public function getUser(){ return $this->user; } }

en tombant sur d'autre forum, je vois qu'il faut ajouté un attribut multiple =true à la formulaire UserType, cela n'est valable qu'au type de champ entité ou collection mais moi je veux avec un type "entityType" comme UserInfoType, à part de créer une formulaire personnalisé pour ajouter l'attribut multiple, y a-t-il d'autre solution de ce genre.
Merci.

1 réponse

nicovak, il y a 10 ans

Une onetomany sous entend un type collection DOC
Dans ton formulaire tu veux ajouter plusieurs autre entités en les créant. L'erreur "Proxies__CG\VS\UserBundle\Entity\Description". vient du lazy loading de doctrine. Tu peux spécifier un fetch EAGER dans tes relations pour eviter ce genre d'erreurs.
Exemple: *ManyToOne(targetEntity="Group", cascade={"all"}, fetch="EAGER")