Recuperation d'un entité appartir d'un repository avec symfony 3
serges007
Messages postés
1
Date d'inscription
Statut
Membre
Dernière intervention
-
link897 -
link897 -
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
voici mon controller Panier
la barre de deboggage indique que l'erreur se trouve au niveau de la ligne 79 du CommandesController
Merci pour vos réactions
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
A voir également:
- Binding entities to query parameters only allowed for entities that have an identifier.
- Downloader for pc - Télécharger - Téléchargement & Transfert
- Power query download - Télécharger - Tableur
- Qwerty to azerty - Guide
- Comment déverrouiller my eyes only sans code - Forum Snapchat
- I'm sorry to have to inform you that your message could not be delivered to one or more recipients. it's attached below. ✓ - Forum Mail
4 réponses
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; } }
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
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