Recuperation d'un entité appartir d'un repository avec symfony 3

Fermé
serges007 Messages postés 1 Date d'inscription vendredi 17 mars 2017 Statut Membre Dernière intervention 17 mars 2017 - Modifié par serges007 le 17/03/2017 à 23:58
 link897 - 18 avril 2017 à 13:17
Salut, je suis entrain de développer un système de e-commerce.j'aimerais recuperer l'objet commande à partir du repository de la commande. le message d'erreur est le suivant

Binding entities to query parameters only allowed for entities that have an identifier.

voici mon controller commandes
<?php

namespace Ecommerce\EcommerceBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
use Ecommerce\EcommerceBundle\Entity\UtilisateurAdresse;
use Symfony\Component\HttpFoundation\Request;
use Ecommerce\EcommerceBundle\Entity\Commande;
use Ecommerce\EcommerceBundle\Entity\Produit;

class CommandesController extends Controller{
    public function facture(Request $request){
        $em = $this->getDoctrine()->getManager();
       // $generator = $this->get('security.secure_random');
        $session = $request->getSession();
        $adresse = $session->get('adresse');
        $panier = $session->get('panier');
        $commande = array();
        $totalHT = 0;
        $totalTVA = 0;
        
        $facturation = $em->getRepository('EcommerceBundle:UtilisateurAdresse')                        ->find($adresse['facturation']);
        $livraison = $em->getRepository('EcommerceBundle:UtilisateurAdresse')       ->find($adresse['livraison']);
        $produits = $em->getRepository('EcommerceBundle:Produit')                         ->findArray(array_keys($session->get('panier')));
        
        foreach($produits as $produit){
            $prixHT = ($produit->getPrix() * $panier[$produit->getId()]);
            $prixTTC = ($produit->getPrix() * $panier[$produit->getId()] / $produit    ->getTva()->getMultiplicate());
            $totalHT += $prixHT;
            
            if (!isset($commande['tva']['%'.$produit->getTva()->getValeur()])){
                $commande['tva']['%'.$produit->getTva()->getValeur()] = round($prixTTC - $prixHT,2);
            }else{
                $commande['tva']['%'.$produit->getTva()->getValeur()] += round($prixTTC - $prixHT,2);
            }
            $totalTVA += round($prixTTC - $prixHT,2);
            
            $commande['produit'][$produit->getId()] = array('reference' => $produit->getNom(),
                                                            'quantite' => $panier[$produit->getId()],
                                                            'prixHT' => round($produit->getPrix(),2),
                                                            'prixTTC' => round($produit->getPrix() / $produit->getTva()->getMultiplicate(),2));
          

            $commande['livraison'] = array('prenom' => $livraison->getPrenom(),
                                        'nom' => $livraison->getNom(),
                                        'telephone' => $livraison->getTelephone(),
                                        'adresse' => $livraison->getAdresse(),
                                        'cp' => $livraison->getCp(),
                                        'ville' => $livraison->getVille(),
                                        'pays' => $livraison->getPays(),
                                        'complement' => $livraison->getComplement());

            $commande['facturation'] = array('prenom' => $facturation->getPrenom(),
                                        'nom' => $facturation->getNom(),
                                        'telephone' => $facturation->getTelephone(),
                                        'adresse' => $facturation->getAdresse(),
                                        'cp' => $facturation->getCp(),
                                        'ville' => $facturation->getVille(),
                                        'pays' => $facturation->getPays(),
                                        'complement' => $facturation->getComplement());

            $commande['prixHT'] = round($totalHT,2);
            $commande['prixTTC'] = round($totalHT + $totalTVA,2);
            $commande['token'] = random_bytes(20);
        }
            return $commande;
    }

    
    
    public function prepareCommandeAction(Request $request){
        $session = $request->getSession();
        $em = $this->getDoctrine()->getManager();
        //on vérifie si la session n'existe 
        if (!$session->has('commande'))
            $commande = new Commande();//si c'est le cas, on instancie une commande
        else
            $commande = $em->getRepository('EcommerceBundle:Commande')->find($session->get('commande'));//on recupere la commande déjà en session
        
        $commande->setDate(new \DateTime());
        $commande->setUtilisateur($this->get('security.token_storage')->getToken()->getUser());
        $commande->setValider(0);
        $commande->setReference(0);
        $commande->setCommande($this->facture($request));
        
        if (!$session->has('commande')) {
            $em->persist($commande);
            $session->set('commande',$commande);
        }
        
        $em->flush();
        
        return new Response($commande->getId());
    }
    
    
}

voici mon controller Panier
<?php

namespace Ecommerce\EcommerceBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Ecommerce\EcommerceBundle\Entity\UtilisateurAdresse;
use Ecommerce\EcommerceBundle\Form\UtilisateurAdresseType;

/**
 * Description of EcommerceController
 *
 * @author mbele
 */
class PanierController extends Controller{
    public function menuAction(Request $request)
    {
        $session = $request->getSession();
        if (!$session->has('panier')){
            $articles = 0;
        }else{
            $articles = count($session->get('panier'));
        }
        return $this->render('EcommerceBundle:Ecommerce:panierQuantite.html.twig', array('articles' => $articles));
    }
    
    public function supprimerAction(Request $request, $id){
        $session = $request->getSession();
        $panier = $session->get('panier');
        
        if (array_key_exists($id, $panier)){
            unset($panier[$id]);
            $session->set('panier',$panier);
            $this->get('session')->getFlashBag()->add('success','Article supprimé avec succès');
        }
        
        return $this->redirect($this->generateUrl('ecommerce_panier')); 
//        return $this->redirectToRoute('ecommerce_panier');        
    }
    
    public function ajouterAction(Request $request,$id){
        $session = $request->getSession();
        
        if (!$session->has('panier')){
            $session->set('panier',array());
        }
        $panier = $session->get('panier');
        
        if (array_key_exists($id, $panier)) {
            if ($request->query->get('qte') != null){
                $panier[$id] = $request->query->get('qte');
            }
            $this->get('session')->getFlashBag()->add('success','Quantité modifié avec succès');
        } else {
            if ($request->query->get('qte') != null){
                $panier[$id] = $request->query->get('qte');
            }else{
                $panier[$id] = 1;
            }
            $this->get('session')->getFlashBag()->add('success','Article ajouté avec succès');
        }
            
        $session->set('panier',$panier);
        
        
        return $this->redirect($this->generateUrl('ecommerce_panier'));
    }
    
    public function panierAction(Request $request) {
        $session = $request->getSession();
        if (!$session->has('panier')) $session->set('panier', array());
        
        $em = $this->getDoctrine()->getManager();
        $produits = $em->getRepository('EcommerceBundle:Produit')->findArray(array_keys($session->get('panier')));
        
        return $this->render('EcommerceBundle:Ecommerce:panier.html.twig', array('produits' => $produits,
                                                                                             'panier' => $session->get('panier')));        
//        return $this->render('EcommerceBundle:Ecommerce:panier.html.twig'); 
    }

    public function adresseSuppressionAction($id)
    {
        $em = $this->getDoctrine()->getManager();
        $entity = $em->getRepository('EcommerceBundle:UtilisateurAdresse')->find($id);
        
         if ($this->get('security.token_storage')->getToken()->getUser() != $entity->getUtilisateur() || !$entity)
            return $this->redirect ($this->generateUrl ('ecommerce_livraison'));
        
        $em->remove($entity);
        $em->flush();
        
        return $this->redirect ($this->generateUrl ('ecommerce_livraison'));
    }
    
    public function livraisonAction(Request $request)
    {
        $utilisateur = $this->get('security.token_storage')->getToken()->getUser();
        $entity = new UtilisateurAdresse();
        $form   = $this->get('form.factory')->create(UtilisateurAdresseType::class, $entity);
        
        if ($request->isMethod('POST') && $form->handleRequest($request)->isValid()){
                $em = $this->getDoctrine()->getManager();
                $entity->setUtilisateur($utilisateur);
                $em->persist($entity);
                $em->flush();
                
                return $this->redirect($this->generateUrl('ecommerce_livraison'));
        }
        
        return $this->render('EcommerceBundle:Ecommerce:livraison.html.twig', array('utilisateur' => $utilisateur,
                                                                                                'form' => $form->createView()));
    }
    
    public function setLivraisonOnSession(Request $request){
        //On recupere l'objet session
        $session = $request->getSession();
        //on vérifie si la session adresse existe ou non
        if (!$session->has('adresse')){
            //si elle n'existe pas on la crée ou on l'initialise 
            $session->set('adresse',array());
        }else{
            //on recupere la session adresse
            $adresse = $session->get('adresse');
        }
        //on recupere les éléments passées dans le formulaire
        if ($request->request->get('livraison') != null && $request->request->get('facturation') != null)
        {
            $adresse['livraison'] = $request->request->get('livraison');
            $adresse['facturation'] = $request->request->get('facturation');
        } else {
            return $this->redirect($this->generateUrl('ecommerce_validation'));
        }
        //on stocke l'adresse dans la session
        $session->set('adresse',$adresse);
//        var_dump($adresse);
//        die();
        return $this->redirect($this->generateUrl('ecommerce_validation'));
    }
    
    public function validationAction(Request $request)
    {
        if ($request->isMethod('POST')){
            $this->setLivraisonOnSession($request);
        }

        $em = $this->getDoctrine()->getManager();
        $prepareCommande = $this->forward('EcommerceBundle:Commandes:prepareCommande',array('request' => $request));
        
        $commande = $em->getRepository('EcommerceBundle:Commande')->find($prepareCommande->getContent());        
        
/*         $em = $this->getDoctrine()->getManager();
        $session = $request->getSession();
        $adresse = $session->get('adresse');
        
       $produits = $em->getRepository('EcommerceBundle:Produit')->findArray(array_keys($session->get('panier')));
        $livraison = $em->getRepository('EcommerceBundle:UtilisateurAdresse')->find($adresse['livraison']);
        $facturation = $em->getRepository('EcommerceBundle:UtilisateurAdresse')->find($adresse['facturation']);*/
        var_dump($prepareCommande->getContent());
        die();        
        return $this->render('EcommerceBundle:Ecommerce:validation.html.twig', array(
            'commande' => $commande));
    }    

}


la barre de deboggage indique que l'erreur se trouve au niveau de la ligne 79 du CommandesController
            $commande = $em->getRepository('EcommerceBundle:Commande')->find($session->get('commande'));//on recupere la commande déjà en session

Merci pour vos réactions

4 réponses

ThEBiShOp Messages postés 8378 Date d'inscription jeudi 22 mars 2007 Statut Contributeur Dernière intervention 8 février 2021 1 565
20 mars 2017 à 15:18
Salut,

ton entité Commande ressemble à quoi ?
0
voici l'entité commande
<?php

namespace Ecommerce\EcommerceBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Commande
 *
 * @ORM\Table(name="commande")
 * @ORM\Entity(repositoryClass="Ecommerce\EcommerceBundle\Repository\CommandeRepository")
 */
class Commande
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="Utilisateurs\UtilisateurBundle\Entity\Utilisateur", inversedBy="commandes")
     * @ORM\JoinColumn(nullable=true)
     */
    private $utilisateur;
    
    
    /**
     * @var bool
     *
     * @ORM\Column(name="valider", type="boolean")
     */
    private $valider;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="date", type="datetime")
     */
    private $date;

    /**
     * @var int
     *
     * @ORM\Column(name="reference", type="integer")
     */
    private $reference;

    /**
     * @var array
     *
     * @ORM\Column(name="commande", type="array")
     */
    private $commande;


    /**
     * Get id
     *
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set valider
     *
     * @param boolean $valider
     *
     * @return Commande
     */
    public function setValider($valider)
    {
        $this->valider = $valider;

        return $this;
    }

    /**
     * Get valider
     *
     * @return bool
     */
    public function getValider()
    {
        return $this->valider;
    }

    /**
     * Set date
     *
     * @param \DateTime $date
     *
     * @return Commande
     */
    public function setDate($date)
    {
        $this->date = $date;

        return $this;
    }

    /**
     * Get date
     *
     * @return \DateTime
     */
    public function getDate()
    {
        return $this->date;
    }

    /**
     * Set reference
     *
     * @param integer $reference
     *
     * @return Commande
     */
    public function setReference($reference)
    {
        $this->reference = $reference;

        return $this;
    }

    /**
     * Get reference
     *
     * @return int
     */
    public function getReference()
    {
        return $this->reference;
    }

    /**
     * Set commande
     *
     * @param array $commande
     *
     * @return Commande
     */
    public function setCommande($commande)
    {
        $this->commande = $commande;

        return $this;
    }

    /**
     * Get commande
     *
     * @return array
     */
    public function getCommande()
    {
        return $this->commande;
    }

    /**
     * Set utilisateur
     *
     * @param \Utilisateurs\UtilisateurBundle\Entity\Utilisateur $utilisateur
     *
     * @return Commande
     */
    public function setUtilisateur(\Utilisateurs\UtilisateurBundle\Entity\Utilisateur $utilisateur = null)
    {
        $this->utilisateur = $utilisateur;

        return $this;
    }

    /**
     * Get utilisateur
     *
     * @return \Utilisateurs\UtilisateurBundle\Entity\Utilisateur
     */
    public function getUtilisateur()
    {
        return $this->utilisateur;
    }
}

0
ThEBiShOp Messages postés 8378 Date d'inscription jeudi 22 mars 2007 Statut Contributeur Dernière intervention 8 février 2021 1 565
21 mars 2017 à 09:20
Dans ton ->find() tu dois passer un id. Visiblement dans $session->get('commande') c'est un objet Commande que tu y mets (je ne suis pas certain que ça fonctionne d'ailleurs)

Si tu as besoin de tout cet objet dans ta session, au moment du find, tu extrais l'id pour le lui passer.
Sinon, au lieu d'enregistrer tout ton objet en session, tu n'enregistres que l'id et tu le ressers au moment de ton find.

Je sais pas si tu m'as suivi
0
Merci pour ta réaction, je vais le faire
0
Bonjour,

J'ai exactement le même problème et ça me rend fou.

Je pense que ça vient de doctrine qui ne rentre pas correctement le tableau dans la bdd mais je n'en suis pas sur. Et même si c'est le cas je ne saurais régler le problème.

Si quelqu'un a une solution, je suis preneur.
0
ThEBiShOp Messages postés 8378 Date d'inscription jeudi 22 mars 2007 Statut Contributeur Dernière intervention 8 février 2021 1 565
18 avril 2017 à 10:11
Difficile de dire quoi que ce soit sans savoir ce qu'il y a dans ton code, tes entités, ta base, etc...
0
link897 > ThEBiShOp Messages postés 8378 Date d'inscription jeudi 22 mars 2007 Statut Contributeur Dernière intervention 8 février 2021
18 avril 2017 à 13:17
J'ai tout refait depuis le début et ça fonctionne maintenant. Aucune idée sur pourquoi ou comment, ça marche...
0