src/Model/Cart.php line 37

Open in your IDE?
  1. <?php
  2. namespace App\Model;
  3. use App\Repository\ProductRepository;
  4. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  5. /**
  6.  * Permet de gérer un panier en session plutot que de tout implémenter dans le controller
  7.  */
  8. class Cart 
  9. {
  10.     private $session;
  11.     public function __construct(SessionInterface $sessionProductRepository $repository)
  12.     {
  13.         $this->session $session;
  14.         $this->repository $repository;
  15.     }
  16.     /**
  17.      * Crée un tableau associatif id => quantité et le stocke en session
  18.      *
  19.      * @param int $id
  20.      * @return void
  21.      */
  22.     public function add(int $id):void
  23.     {
  24.         $cart $this->session->get('cart', []);
  25.         if (empty($cart[$id])) {
  26.             $cart[$id] = 1;
  27.         } else {
  28.             $cart[$id]++;
  29.         }
  30.         $this->session->set('cart'$cart);
  31.     }
  32.     /**
  33.      * Récupère le panier en session
  34.      *
  35.      * @return array
  36.      */
  37.     public function get(): array
  38.     {
  39.         return $this->session->get('cart');
  40.     }
  41.     /**
  42.      * Supprime entièrement le panier en session
  43.      *
  44.      * @return void
  45.      */
  46.     public function remove(): void
  47.     {
  48.         $this->session->remove('cart');
  49.     }
  50.     /**
  51.      * Supprime entièrement un produit du panier (quelque soit sa quantité)
  52.      *
  53.      * @param int $id
  54.      * @return void
  55.      */
  56.     public function removeItem(int $id): void
  57.     {
  58.         $cart $this->session->get('cart', []);
  59.         unset($cart[$id]);
  60.         $this->session->set('cart'$cart);
  61.     }
  62.     /**
  63.      * Diminue de 1 la quantité d'un produit
  64.      *
  65.      * @param int $id
  66.      * @return void
  67.      */
  68.     public function decreaseItem(int $id): void
  69.     {
  70.         $cart $this->session->get('cart', []);
  71.         if ($cart[$id] < 2) {
  72.             unset($cart[$id]);
  73.         } else {
  74.             $cart[$id]--;
  75.         }
  76.         $this->session->set('cart'$cart);
  77.     }
  78.     /**
  79.      * Récupère le panier en session, puis récupère les objets produits de la bdd
  80.      * et calcule les totaux
  81.      *
  82.      * @return array
  83.      */
  84.     public function getDetails(): array
  85.     {
  86.         $cartProducts = [
  87.             'products' => [],
  88.             'totals' => [
  89.                 'quantity' => 0,
  90.                 'price' => 0,
  91.             ],
  92.         ];
  93.         $cart $this->session->get('cart', []);
  94.         if ($cart) {
  95.             foreach ($cart as $id => $quantity) {
  96.                 $currentProduct $this->repository->find($id);
  97.                 if ($currentProduct) {
  98.                     $cartProducts['products'][] = [
  99.                         'product' => $currentProduct,
  100.                         'quantity' => $quantity
  101.                     ];
  102.                     $cartProducts['totals']['quantity'] += $quantity;
  103.                     $cartProducts['totals']['price'] += $quantity $currentProduct->getPrice();
  104.                 }
  105.             }
  106.         }
  107.         return $cartProducts;
  108.     }
  109. }