IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

[Symfony2] Erreur cascade persist d'un objet récupéré en session


Sujet :

Symfony PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2013
    Messages : 5
    Par défaut [Symfony2] Erreur cascade persist d'un objet récupéré en session
    Bonjour,

    Voilà quelques temps que je commence à buter sur un problème que je n'arrive pas à résoudre alors j'en appelle à la communauté de venir à mon secours !

    Pour faire simple, j'ai un premier formulaire (étape 1/2) où l'utilisateur remplit de multiples champs. Après avoir cliqué sur Suivant, ce dernier est redirigé vers une seconde page (étape 2/2) qui lui affiche un récapitulatif de ses informations saisies. Il clique alors sur Valider pour confirmer les informations.

    Plus précisément, sur la 1ère page, j'encapsule les informations de la manière suivante pour les mettre en session :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $session = $this->get('session');
    $session->set('commande', $commande);
    L'utilisateur est alors redirigé sur la seconde page de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    return $this->render('TestCommandeBundle:Commande:create_steptwo_container.html.twig');
    Sur la page 2, je récupère les informations comme ceci sur la page twig:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    {% set commande = app.session.get('commande') %}
    Puis, j'affiche les différentes informations.
    Et à la fin de la page 2, un bouton valider qui me redirige sur l'action createTestAction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public function createTestAction()
        {
        	$session = $this->get('session');
        	$commande = $session->get('commande');
        	$em = $this->getDoctrine()->getManager();
        	$em->persist($commande);
        	$em->flush();
        	return $this->render('TestCommandeBundle:Commande:create_final_container.html.twig');    
        }
    Et là ce message d'erreur :

    A new entity was found through the relationship 'Test\CommandeBundle\Entity\Adherent#options' that was not configured to cascade persist operations for entity: Test\CommandeBundle\Entity\Options@00000000528e9f7c00000000f4b85ac3.
    Ce qui est d'autant plus bizarre, c'est que lorsque je fais le persist et le flush directement sur la validation de la 1ere page (page précédante), tout fonctionne parfaitement ! Ce qui n'est pourtant pas le cas lorsque visiblement je récupère ma variable $commande depuis une session. Ce dysfonctionnement est-il du à l'utilisation d'une session ?

    Pour info, si je n'ai pas mis de cascade = persist entre adhérent et options, c'est complètement voulu ! Les options sont des données statiques que je ne souhaitent pas persister mais uniquement récupérer en lecture seule depuis une liste déroulante sur le 1er écran.

    Bref, là je suis complètement perdu, ça fait des heures et des heures que je tourne en rond ! Merci d'avance à quiconque aurait une idée sur le sujet

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2009
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2009
    Messages : 126
    Par défaut Doc "Doctrine Entities in session"
    Salut,

    Merci de soulever le problème, perso je passerai l'id de commande dans la session.

    Regarde de ce côté pour l'implémentation d'une entité doctrine en session :

    http://docs.doctrine-project.org/en/...n-session.html

    Apparemment il faut faire 2 opérations :
    - détacher l'entité du manager qui l'a créée puis la mettre en session
    - l'intégrer au nouveau manager

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2013
    Messages : 5
    Par défaut
    A vrai dire, je ne peux pas utiliser l'id de la commande dans la session puisque l'id de la commande est en auto-incrément donc initialisé seulement après un flush en BD (ce que je ne souhaite faire qu'à la dernière étape de la création de la commande).

    J'ai voulu faire ce que tu m'as dit,
    Apparemment il faut faire 2 opérations :
    - détacher l'entité du manager qui l'a créée puis la mettre en session
    - l'intégrer au nouveau manager
    seulement ça ne fonctionne pas, j'ai une nouvelle erreur qui apparaît !

    The given entity of type 'Lycee\CommandeBundle\Entity\Adherent' (Proxies\__CG__\Lycee\CommandeBundle\Entity\Adherent@0000000001f2d71e00000000ad3f68a8) has no identity/no id values set. It cannot be added to the identity map.
    Voilà le code que j'ai pu écrire dans la fonction de l'étape 1 du formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $em = $this->getDoctrine()->getEntityManager();
    $em->detach($commande);
    $session = $this->get('session');
    $session->set('commande',$commande);
    Dans la fonction de l'étape 2 du formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $em = $this->getDoctrine()->getEntityManager();
    $commande = $em->merge($cmd);
    $em->persist($commande);
    $em->flush();

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 60
    Par défaut
    Bonjour,

    Faut-il absolument que tu utilises une session ? Il me semblerait en effet plus simple d'avoir une action par étape dans ton contrôleur et d'utiliser un forward en transmettant tes entités d'une étape à l'autre.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2013
    Messages : 5
    Par défaut
    Non pas obligatoirement en session.
    Après comment tu fais sous Symfony pour utiliser un forward en transmettant tes entités d'une étape à l'autre ?

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 60
    Par défaut
    Comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public function stepOneAction() {
    ...
     
        return $this->forward('Bundle:Ctl:stepTwo', array(
            'commande' => $commande
        ));
    }
     
    public function stepTwoAction($commande) {
    ...
    }
    Cela suppose que ton contrôleur étend la classe contrôleur (je te laisse regarder le code de symfony si tu étends containerAware).
    Il ne te reste plus qu'à hydrater ton formType avec la variable $commande dans la deuxième étape.

  7. #7
    Membre expérimenté
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2009
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2009
    Messages : 126
    Par défaut
    Ok avec frfrance31 passe le en paramètre de la méthode

    Sinon tu récupères pas l'entity en session dans l'étape 2 :

    Citation Envoyé par dll28 Voir le message
    Dans la fonction de l'étape 2 du formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $em = $this->getDoctrine()->getEntityManager();
    $commande = $em->merge($cmd);
    $em->persist($commande);
    $em->flush();
    Essayes ça :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $em = $this->getDoctrine()->getEntityManager();
    $session = $this->get('session');
    $commande = $session->get('commande',$commande);
    $commande = $em->merge($commande);
    $em->persist($commande);
    $em->flush();

  8. #8
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2013
    Messages : 5
    Par défaut
    J'ai essayé ce que tu m'as dit mais toujours la même erreur !

    The given entity of type 'Lycee\CommandeBundle\Entity\Adherent' (Proxies\__CG__\Lycee\CommandeBundle\Entity\Adherent@0000000001f2d71e00000000ad3f68a8) has no identity/no id values set. It cannot be added to the identity map.

  9. #9
    Candidat au Club
    Inscrit en
    Novembre 2011
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2011
    Messages : 3
    Par défaut
    Essaye de mettre toutes tes variable et relation private en protected dans ton entity ADherent.

Discussions similaires

  1. Erreur quand je mets un objet automation en session
    Par WebPac dans le forum ASP.NET
    Réponses: 11
    Dernier message: 21/12/2011, 10h50
  2. [EJB3] erreur cascade PERSIST
    Par missastro dans le forum Java EE
    Réponses: 1
    Dernier message: 25/08/2009, 17h57
  3. Réponses: 6
    Dernier message: 21/07/2006, 15h48
  4. [DOM XML] Erreur fonction load() d'un objet dom??
    Par ribrok dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 04/10/2005, 11h43
  5. [ArrayList]transformer l'objet récupéré en double...
    Par snoop dans le forum Collection et Stream
    Réponses: 10
    Dernier message: 16/07/2004, 16h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo