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
Réponse acceptée

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

$this->requestStack->getSession()->set('cart', $cart);

Bonjour,

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

public function updateCart($cart){
    $this->requestStack->getSession->set('cart', $cart);
}
barpoi78
Auteur

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

barpoi78
Auteur

Merci beaucoup ça fonctionne