custom/plugins/WbmTagManagerEcomm/src/Subscriber/KernelEventsSubscriber.php line 47

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Wbm\TagManagerEcomm\Subscriber;
  3. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  4. use Symfony\Component\HttpFoundation\Cookie;
  5. use Symfony\Component\HttpKernel\Event\ControllerEvent;
  6. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  7. use Symfony\Component\HttpKernel\KernelEvents;
  8. use Wbm\TagManagerEcomm\Services\DataLayerModulesInterface;
  9. use Wbm\TagManagerEcomm\Services\DataLayerRendererInterface;
  10. class KernelEventsSubscriber implements EventSubscriberInterface
  11. {
  12.     const COOKIE_NAME '_gtm_push';
  13.     /**
  14.      * @var DataLayerModulesInterface
  15.      */
  16.     private $modules;
  17.     /**
  18.      * @var DataLayerRendererInterface
  19.      */
  20.     private $dataLayerRenderer;
  21.     public function __construct(
  22.         DataLayerModulesInterface $modules,
  23.         DataLayerRendererInterface $dataLayerRender
  24.     ) {
  25.         $this->modules $modules;
  26.         $this->dataLayerRenderer $dataLayerRender;
  27.     }
  28.     public static function getSubscribedEvents(): array
  29.     {
  30.         return [
  31.             KernelEvents::CONTROLLER => [
  32.                 ['getDataLayerForXmlHttpRequest'],
  33.             ],
  34.             KernelEvents::RESPONSE => [
  35.                 ['prependDataLayerToResponse'],
  36.             ],
  37.         ];
  38.     }
  39.     public function getDataLayerForXmlHttpRequest(ControllerEvent $event): void
  40.     {
  41.         $salesChannelId $event->getRequest()->get('sw-sales-channel-id');
  42.         $isActive = !empty($this->modules->getContainerId($salesChannelId)) && $this->modules->isActive($salesChannelId);
  43.         if ($isActive && !$event->getRequest()->cookies->get(self::COOKIE_NAME)) {
  44.             $modules $this->modules->getModules();
  45.             $route $event->getRequest()->attributes->get('_route');
  46.             if (array_key_exists($route$modules) && !empty($modules[$route])) {
  47.                 $this->dataLayerRenderer->setVariables($route, [])
  48.                     ->renderDataLayer($route);
  49.             }
  50.         }
  51.     }
  52.     public function prependDataLayerToResponse(ResponseEvent $event): void
  53.     {
  54.         $response $event->getResponse();
  55.         $request $event->getRequest();
  56.         $cookie $request->cookies->get(self::COOKIE_NAME);
  57.         $response->headers->clearCookie(self::COOKIE_NAME);
  58.         $route $event->getRequest()->attributes->get('_route');
  59.         $dataLayer $this->dataLayerRenderer->getDataLayer($route);
  60.         if ($dataLayer !== null) {
  61.             $dataLayer json_encode($dataLayer);
  62.         }
  63.         if (!empty($dataLayer) && $response->isRedirect()) {
  64.             $response->headers->setCookie(
  65.                 new Cookie(
  66.                     self::COOKIE_NAME,
  67.                     $dataLayer,
  68.                     0,
  69.                     '/',
  70.                     null,
  71.                     $request->isSecure(),
  72.                     true,
  73.                     false,
  74.                     Cookie::SAMESITE_LAX
  75.                 )
  76.             );
  77.             return;
  78.         }
  79.         if (!$request->isXmlHttpRequest()) {
  80.             return;
  81.         }
  82.         if ($cookie && in_array($route$this->modules->getResponseRoutes(), true)) {
  83.             $dataLayer $cookie;
  84.         }
  85.         if (empty($dataLayer)) {
  86.             return;
  87.         }
  88.         $response->headers->set(
  89.             'Access-Control-Allow-Headers',
  90.             $response->headers->get('Access-Control-Allow-Headers') . ',gtm-push'
  91.         );
  92.         $response->headers->set('gtm-push'$dataLayer);
  93.         $event->setResponse($response);
  94.     }
  95. }