Utiliser des sessions dans Symfony version 5.3.9 avec RequestStack

Par barpoi78, il y a 4 ans


Bonjour,

J'essaie d'utiliser des sessions dans Symfony version 5.3.9 avec RequestStack car SessionInterface est obsolète mais je n'obtiens aucun résuttat alors que dans symfony 5.2 c'était ok:

Résultat

CartController.php on line 20: []

Je vous remercie de votre aide

CartController.php :

<?php namespace App\Controller; use App\Services\CartServices; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\HttpFoundation\Session\SessionInterface; class CartController extends AbstractController { /** * @Route("/cart/add/{id}") */ public function addToCart($id,CartServices $cartServices):Response { $cartServices->addToCart($id); dd($cartServices->getCart(1)); return $this->render('cart/index.html.twig', [ 'controller_name' => 'CartController', ]); } }

CartServices.php:

<?php namespace App\Services; use App\Repository\ProductRepository; use Symfony\Component\HttpFoundation\RequestStack; class CartServices { private $requestStack; private $repoProduct; public function __construct(RequestStack $requestStack, ProductRepository $repoProduct) { $this->requestStack = $requestStack; $this->repoProduct = $repoProduct; } public function addToCart($id){ $cart = $this->getCart(); if(isset($cart[$id])){ //produit déjà dans le panier on incrémente $cart[$id]++; }else{ //produit pas encore dans le panier on ajoute $cart[$id] = 1; } $this->updateCart($cart); } public function deleteFromCart($id){ $cart = $this->getCart(); //si produit déjà dans le panier if(isset($cart[$id])){ //si il y a plus d'une fois le produit dans le panier on décrémente if($cart[$id] >1){ $cart[$id] --; }else{ //Sinon on supprime unset($cart[$id]); } //on met à jour la session $this->updateCart($cart); } } public function deleteAllToCart($id){ $cart = $this->getCart(); //si produit(s) déjà dans le panier if(isset($cart[$id])){ //on supprime unset($cart[$id]); } //on met à jour la session $this->updateCart($cart); } public function deleteCart(){ //on supprime tous les produits (on vide le panier) $this->updateCart([]); } public function updateCart($cart){ $this->requestStack->getSession('cart', $cart); } public function getCart(){ $session = $this->requestStack->getSession(); return $session->get('cart', []); } public function getFullCart(){ $cart = $this->getCart(); $fullCart = []; foreach ($cart as $id => $quantity){ $product = $this->repoProduct->find($id); if($product){ //produit récupéré avec succés $fullCart[]=[ 'quantity' => $quantity, 'product' => $product ]; }else{ //id incorrect $this->deleteFromCart($id); //on ne met pas à jour la session car cette method le fait aussi (voir plus haut dans la fonction deleteFromCart) } } } }

4 réponses

gillesr, il y a 4 ans

Bonjour,

Ta méthode updateCart ne devrait-elle pas faire un set ?

public function updateCart($cart){ $this->requestStack->getSession->set('cart', $cart); }
barpoi78, il y a 4 ans

Non cela me renvoi: Notice: Undefined property: Symfony\Component\HttpFoundation\RequestStack::$getSession

gillesr, il y a 4 ans

J'ai oublié les parenthèses lors de l'appel à la méthode getSession(). Il faut écrire :

$this->requestStack->getSession()->set('cart', $cart);
barpoi78, il y a 4 ans

Merci beaucoup ça fonctionne