vendor/pimcore/pimcore/bundles/EcommerceFrameworkBundle/EventListener/Frontend/TrackingCodeFlashMessageListener.php line 65

Open in your IDE?
  1. <?php
  2. /**
  3.  * Pimcore
  4.  *
  5.  * This source file is available under two different licenses:
  6.  * - GNU General Public License version 3 (GPLv3)
  7.  * - Pimcore Commercial License (PCL)
  8.  * Full copyright and license information is available in
  9.  * LICENSE.md which is distributed with this source code.
  10.  *
  11.  *  @copyright  Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  12.  *  @license    http://www.pimcore.org/license     GPLv3 and PCL
  13.  */
  14. namespace Pimcore\Bundle\EcommerceFrameworkBundle\EventListener\Frontend;
  15. use Pimcore\Bundle\CoreBundle\EventListener\Traits\PimcoreContextAwareTrait;
  16. use Pimcore\Bundle\EcommerceFrameworkBundle\Tracking\TrackingCodeAwareInterface;
  17. use Pimcore\Bundle\EcommerceFrameworkBundle\Tracking\TrackingManager;
  18. use Pimcore\Http\Request\Resolver\PimcoreContextResolver;
  19. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  20. use Symfony\Component\HttpFoundation\Cookie;
  21. use Symfony\Component\HttpFoundation\Exception\SessionNotFoundException;
  22. use Symfony\Component\HttpFoundation\RequestStack;
  23. use Symfony\Component\HttpFoundation\Session\Session;
  24. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  25. use Symfony\Component\HttpKernel\Event\RequestEvent;
  26. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  27. use Symfony\Component\HttpKernel\KernelEvents;
  28. /**
  29.  * @internal
  30.  */
  31. class TrackingCodeFlashMessageListener implements EventSubscriberInterface
  32. {
  33.     use PimcoreContextAwareTrait;
  34.     const FLASH_MESSAGE_BAG_KEY 'ecommerceframework_trackingcode_flashmessagelistener';
  35.     /**
  36.      * @var RequestStack
  37.      */
  38.     protected RequestStack $requestStack;
  39.     /**
  40.      * @var TrackingManager
  41.      */
  42.     protected $trackingManger;
  43.     public function __construct(RequestStack $requestStackTrackingManager $trackingManager)
  44.     {
  45.         $this->requestStack $requestStack;
  46.         $this->trackingManger $trackingManager;
  47.     }
  48.     public static function getSubscribedEvents(): array
  49.     {
  50.         return [
  51.             KernelEvents::REQUEST => 'onKernelRequest',
  52.             KernelEvents::RESPONSE => 'onKernelResponse',
  53.         ];
  54.     }
  55.     public function onKernelRequest(RequestEvent $event)
  56.     {
  57.         $request $event->getRequest();
  58.         if (!$this->matchesPimcoreContext($requestPimcoreContextResolver::CONTEXT_DEFAULT)) {
  59.             return;
  60.         }
  61.         if (!$event->isMainRequest()) {
  62.             return;
  63.         }
  64.         // Check FlashBag cookie exists to avoid autostart session by accessing the FlashBag.
  65.         $flashBagCookie = (bool)$request->cookies->get(self::FLASH_MESSAGE_BAG_KEY);
  66.         $session $this->getSession();
  67.         if ($flashBagCookie && $session instanceof Session) {
  68.             $trackedCodes $session->getFlashBag()->get(self::FLASH_MESSAGE_BAG_KEY);
  69.             if (is_array($trackedCodes) && count($trackedCodes)) {
  70.                 foreach ($this->trackingManger->getTrackers() as $tracker) {
  71.                     if ($tracker instanceof TrackingCodeAwareInterface && isset($trackedCodes[get_class($tracker)])) {
  72.                         foreach ($trackedCodes[get_class($tracker)] as $trackedCode) {
  73.                             $tracker->trackCode($trackedCode);
  74.                         }
  75.                     }
  76.                 }
  77.             }
  78.         }
  79.     }
  80.     /**
  81.      * @return SessionInterface|null
  82.      */
  83.     private function getSession(): ?SessionInterface
  84.     {
  85.         try {
  86.             $session $this->requestStack->getSession();
  87.         } catch (SessionNotFoundException) {
  88.             $session null;
  89.         }
  90.         return $session;
  91.     }
  92.     /**
  93.      * @param ResponseEvent $event
  94.      */
  95.     public function onKernelResponse(ResponseEvent $event)
  96.     {
  97.         $response $event->getResponse();
  98.         $request $event->getRequest();
  99.         $session $this->getSession();
  100.         /**
  101.          * If tracking codes are forwarded as FlashMessage, then set a cookie which is checked in subsequent request for successful handshake
  102.          * else clear cookie, if set and FlashBag is already processed.
  103.          */
  104.         if (
  105.             $session instanceof Session &&
  106.             $session->isStarted() &&
  107.             $session->getFlashBag()->has(self::FLASH_MESSAGE_BAG_KEY)
  108.         ) {
  109.             $response->headers->setCookie(new Cookie(self::FLASH_MESSAGE_BAG_KEY'1'));
  110.             $response->headers->set('X-Pimcore-Output-Cache-Disable-Reason''Tracking Codes Passed');
  111.         } elseif ($request->cookies->has(self::FLASH_MESSAGE_BAG_KEY)) {
  112.             $response->headers->clearCookie(self::FLASH_MESSAGE_BAG_KEY);
  113.         }
  114.     }
  115. }