vendor/pimcore/pimcore/bundles/EcommerceFrameworkBundle/SessionEnvironment.php line 153

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. /**
  4.  * Pimcore
  5.  *
  6.  * This source file is available under two different licenses:
  7.  * - GNU General Public License version 3 (GPLv3)
  8.  * - Pimcore Commercial License (PCL)
  9.  * Full copyright and license information is available in
  10.  * LICENSE.md which is distributed with this source code.
  11.  *
  12.  *  @copyright  Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  13.  *  @license    http://www.pimcore.org/license     GPLv3 and PCL
  14.  */
  15. namespace Pimcore\Bundle\EcommerceFrameworkBundle;
  16. use Pimcore\Bundle\EcommerceFrameworkBundle\EventListener\SessionBagListener;
  17. use Pimcore\Localization\LocaleServiceInterface;
  18. use Symfony\Component\HttpFoundation\Exception\SessionNotFoundException;
  19. use Symfony\Component\HttpFoundation\RequestStack;
  20. use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBagInterface;
  21. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  22. class SessionEnvironment extends Environment implements EnvironmentInterface
  23. {
  24.     const SESSION_KEY_CUSTOM_ITEMS 'customitems';
  25.     const SESSION_KEY_USERID 'userid';
  26.     const SESSION_KEY_USE_GUEST_CART 'useguestcart';
  27.     const SESSION_KEY_ASSORTMENT_TENANT 'currentassortmenttenant';
  28.     const SESSION_KEY_ASSORTMENT_SUB_TENANT 'currentassortmentsubtenant';
  29.     const SESSION_KEY_CHECKOUT_TENANT 'currentcheckouttenant';
  30.     /**
  31.      *
  32.      * @deprecated will be removed in Pimcore 11
  33.      *
  34.      * @var SessionInterface
  35.      */
  36.     protected $session;
  37.     /**
  38.      * @var RequestStack
  39.      */
  40.     protected RequestStack $requestStack;
  41.     /**
  42.      * @var bool
  43.      */
  44.     protected $sessionLoaded false;
  45.     public function __construct(SessionInterface $sessionLocaleServiceInterface $localeService, array $options = [])
  46.     {
  47.         parent::__construct($localeService$options);
  48.         $this->session $session;
  49.     }
  50.     /**
  51.      * @TODO move to constructor injection in Pimcore 11
  52.      *
  53.      * @required
  54.      *
  55.      * @internal
  56.      *
  57.      * @param RequestStack $requestStack
  58.      */
  59.     public function setRequestStack(RequestStack $requestStack): void
  60.     {
  61.         $this->requestStack $requestStack;
  62.     }
  63.     protected function load()
  64.     {
  65.         if ($this->sessionLoaded) {
  66.             return;
  67.         }
  68.         //if the session was not explicitly started in cli environment, do nothing
  69.         if ('cli' === php_sapi_name() && !$this->checkSessionStartedInCli()) {
  70.             return;
  71.         }
  72.         $sessionBag $this->getSessionBag();
  73.         $this->customItems $sessionBag->get(self::SESSION_KEY_CUSTOM_ITEMS, []);
  74.         $this->userId $sessionBag->get(self::SESSION_KEY_USERIDself::USER_ID_NOT_SET);
  75.         $this->currentAssortmentTenant $sessionBag->get(self::SESSION_KEY_ASSORTMENT_TENANT);
  76.         $this->currentAssortmentSubTenant $sessionBag->get(self::SESSION_KEY_ASSORTMENT_SUB_TENANT);
  77.         $this->currentCheckoutTenant $sessionBag->get(self::SESSION_KEY_CHECKOUT_TENANT);
  78.         $this->currentTransientCheckoutTenant $sessionBag->get(self::SESSION_KEY_CHECKOUT_TENANT);
  79.         $this->useGuestCart $sessionBag->get(self::SESSION_KEY_USE_GUEST_CART);
  80.         $this->sessionLoaded true;
  81.     }
  82.     public function save()
  83.     {
  84.         //if the session was not explicitly started in cli environment, do nothing
  85.         if ('cli' === php_sapi_name() && !$this->checkSessionStartedInCli()) {
  86.             return;
  87.         }
  88.         $this->load();
  89.         $sessionBag $this->getSessionBag();
  90.         $sessionBag->set(self::SESSION_KEY_CUSTOM_ITEMS$this->customItems);
  91.         $sessionBag->set(self::SESSION_KEY_USERID$this->userId);
  92.         $sessionBag->set(self::SESSION_KEY_ASSORTMENT_TENANT$this->currentAssortmentTenant);
  93.         $sessionBag->set(self::SESSION_KEY_ASSORTMENT_SUB_TENANT$this->currentAssortmentSubTenant);
  94.         $sessionBag->set(self::SESSION_KEY_CHECKOUT_TENANT$this->currentCheckoutTenant);
  95.         $sessionBag->set(self::SESSION_KEY_USE_GUEST_CART$this->useGuestCart);
  96.     }
  97.     public function clearEnvironment()
  98.     {
  99.         parent::clearEnvironment();
  100.         //if the session was not explicitly started in cli environment, do nothing
  101.         if ('cli' === php_sapi_name() && !$this->checkSessionStartedInCli()) {
  102.             return;
  103.         }
  104.         $this->load();
  105.         $sessionBag $this->getSessionBag();
  106.         $sessionBag->remove(self::SESSION_KEY_CUSTOM_ITEMS);
  107.         $sessionBag->remove(self::SESSION_KEY_USERID);
  108.         $sessionBag->remove(self::SESSION_KEY_USE_GUEST_CART);
  109.         $sessionBag->remove(self::SESSION_KEY_ASSORTMENT_TENANT);
  110.         $sessionBag->remove(self::SESSION_KEY_ASSORTMENT_SUB_TENANT);
  111.         $sessionBag->remove(self::SESSION_KEY_CHECKOUT_TENANT);
  112.     }
  113.     /**
  114.      * @return AttributeBagInterface
  115.      */
  116.     protected function getSessionBag(): AttributeBagInterface
  117.     {
  118.         /** @var AttributeBagInterface $sessionBag */
  119.         $sessionBag $this->getSession()->getBag(SessionBagListener::ATTRIBUTE_BAG_ENVIRONMENT);
  120.         return $sessionBag;
  121.     }
  122.     private function getSession(bool $preventDeprecationWarning false): SessionInterface
  123.     {
  124.         try {
  125.             return $this->requestStack->getSession();
  126.         } catch (SessionNotFoundException $e) {
  127.             if (!$preventDeprecationWarning) {
  128.                 trigger_deprecation('pimcore/pimcore''10.5',
  129.                     sprintf('Session used with non existing request stack in %s, that will not be possible in Pimcore 11.'SessionEnvironment::class));
  130.             }
  131.             return \Pimcore::getContainer()->get('session');
  132.         }
  133.     }
  134.     /**
  135.      * @deprecated
  136.      *
  137.      * @todo Remove in Pimcore 11
  138.      */
  139.     private function checkSessionStartedInCli(): bool
  140.     {
  141.         $session $this->getSession(true);
  142.         if ($session->isStarted()) {
  143.             trigger_deprecation('pimcore/pimcore''10.5',
  144.                 sprintf('Do not depend on started session in CLI mode for %s, that will not be possible in Pimcore 11.'SessionEnvironment::class));
  145.             return true;
  146.         }
  147.         return false;
  148.     }
  149. }