custom/static-plugins/GlobusSW6/src/Subscriber/App/SessionSubscriber.php line 53

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace GlobusSW6\Subscriber\App;
  3. use GlobusSW6\Service\App\AppFromRequestIdentifier;
  4. use GlobusSW6\Service\App\AppService;
  5. use Psr\Log\LoggerInterface;
  6. use Shopware\Core\Framework\Util\Random;
  7. use Shopware\Core\PlatformRequest;
  8. use Shopware\Core\SalesChannelRequest;
  9. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  10. use Symfony\Component\HttpFoundation\HeaderBag;
  11. use Symfony\Component\HttpFoundation\RequestStack;
  12. use Symfony\Component\HttpKernel\KernelEvents;
  13. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  14. class SessionSubscriber implements EventSubscriberInterface
  15. {
  16.     private RequestStack $requestStack;
  17.     /** @var AppFromRequestIdentifier */
  18.     private $appIdentifier;
  19.     /** @var LoggerInterface */
  20.     private $logger;
  21.     /** @var AppService */
  22.     private $appService;
  23.     /**
  24.      * @param RequestStack $requestStack
  25.      * @param AppFromRequestIdentifier $appIdentifier
  26.      * @param LoggerInterface $logger
  27.      * @param AppService $appService
  28.      */
  29.     public function __construct(RequestStack $requestStackAppFromRequestIdentifier $appIdentifierLoggerInterface $loggerAppService $appService)
  30.     {
  31.         $this->requestStack $requestStack;
  32.         $this->appIdentifier $appIdentifier;
  33.         $this->logger $logger;
  34.         $this->appService $appService;
  35.     }
  36.     public static function getSubscribedEvents(): array
  37.     {
  38.         return [
  39.             KernelEvents::REQUEST => [ // Overwrite session functionality from Storefront Subscriber
  40.                 ['startSession'39]
  41.             ]
  42.         ];
  43.     }
  44.     public function startSession()
  45.     {
  46.         try{
  47.             $master $this->requestStack->getMainRequest();
  48.             if (!$master) {
  49.                 return;
  50.             }
  51.             if (!$master->hasSession()) {
  52.                 return;
  53.             }
  54.             /** @var SessionInterface $session */
  55.             $session $master->getSession();
  56.             /** @var HeaderBag $header */
  57.             $header $master->headers;
  58.             // If FBO-route /show-header : set ianeoCurrentStore for this route -> This will enforce the twig header to contain the desired id
  59.             try {
  60.                 if (strpos($master->getPathInfo(), '/show-header') !== false){
  61.                     if (!is_null($master->get('storeId'))) {
  62.                         $session->set('ianeoCurrentStore'$master->get('storeId'));
  63.                         return;
  64.                     }
  65.                 }
  66.             } catch (\Throwable $t){
  67.                 $this->logger->info('unable to set ianeoCurrentStore for /show-header: ' $t->getMessage());
  68.             }
  69.             if (!$this->appIdentifier->isApp($master)){
  70.                 return;
  71.             }
  72.             $device_id $header->get('x-globus-device-id');
  73.             if (is_null($master->headers->get(PlatformRequest::HEADER_CONTEXT_TOKEN))){
  74.                 $this->appService->saveDevice($device_idRandom::getAlphanumericString(32));
  75.             } else {
  76.                 $this->appService->saveDevice($device_id$master->headers->get(PlatformRequest::HEADER_CONTEXT_TOKEN));
  77.             }
  78.             $device $this->appService->getAppDeviceById($device_id);
  79.             if (!$master->attributes->get(SalesChannelRequest::ATTRIBUTE_IS_SALES_CHANNEL_REQUEST) && is_null($device)) {
  80.                 return;
  81.             }
  82.             // Check if request is from app and if session-token has right value for app - if not, set sw-context-token and selected store for app
  83.             if ($this->appIdentifier->isApp($master) && $session->get(PlatformRequest::HEADER_CONTEXT_TOKEN) !== $device->getSwContextToken()) {
  84.                 $session->set(PlatformRequest::HEADER_CONTEXT_TOKEN$device->getSwContextToken());
  85.                 $session->set('x-globus-customer'$device->getCustomerId());
  86.                 $session->set('x-globus-device-id'$device->getDeviceId());
  87.                 if (!is_null($device->getStoreLegacyId())){
  88.                     $session->set('ianeoCurrentStore'$device->getStoreLegacyId());
  89.                 }
  90.                 $master->headers->set(
  91.                     PlatformRequest::HEADER_CONTEXT_TOKEN,
  92.                     $session->get(PlatformRequest::HEADER_CONTEXT_TOKEN)
  93.                 );
  94.             }
  95.         } catch (\Throwable $t) {
  96.             $this->logger->error(__CLASS__ ":" __FUNCTION__ ":" __LINE__ ":\$exception->getMessage(): " $t->getMessage());
  97.         }
  98.     }
  99. }