custom/plugins/AcrisPersistentCartCS/src/Subscriber/ResponseSubscriber.php line 38

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Acris\PersistentCart\Subscriber;
  3. use Acris\PersistentCart\Framework\Cookie\PersistentCartCookieProvider;
  4. use Shopware\Core\Framework\Event\BeforeSendResponseEvent;
  5. use Shopware\Core\PlatformRequest;
  6. use Shopware\Core\SalesChannelRequest;
  7. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  8. use Shopware\Storefront\Framework\Cache\CacheResponseSubscriber;
  9. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  10. use Symfony\Component\HttpFoundation\Cookie;
  11. use Symfony\Component\HttpFoundation\RequestStack;
  12. use Symfony\Component\HttpKernel\KernelEvents;
  13. class ResponseSubscriber implements EventSubscriberInterface
  14. {
  15.     /**
  16.      * @var RequestStack
  17.      */
  18.     private $requestStack;
  19.     public function __construct(RequestStack $requestStack)
  20.     {
  21.         $this->requestStack $requestStack;
  22.     }
  23.     public static function getSubscribedEvents()
  24.     {
  25.         return [
  26.             KernelEvents::REQUEST => [
  27.                 ['setSessionToken'60]
  28.             ],
  29.             BeforeSendResponseEvent::class => 'setAcrisPersistentCartResponseCookie'
  30.         ];
  31.     }
  32.     public function setAcrisPersistentCartResponseCookie(BeforeSendResponseEvent $responseEvent)
  33.     {
  34.         $request $responseEvent->getRequest();
  35.         $response $responseEvent->getResponse();
  36.         if($response->isCacheable() !== false) {
  37.             return;
  38.         }
  39.         if(strpos($request->getPathInfo(), '/account/logout') !== false) {
  40.             $response->headers->clearCookie(PersistentCartCookieProvider::ACRIS_PERSISTENT_CART_TOKEN_COOKIE_NAME);
  41.             return;
  42.         }
  43.         if($request->headers->has(PlatformRequest::HEADER_CONTEXT_TOKEN)) {
  44.             if($request->cookies->get(PersistentCartCookieProvider::ACRIS_PERSISTENT_CART_SW_COOKIE_NAME)
  45.                 || $request->cookies->get(PersistentCartCookieProvider::ACRIS_PERSISTENT_CART_COOKIE_NAMES_COOKIE_PLUGIN)) {
  46.                 $response->headers->setCookie(
  47.                     new Cookie(
  48.                         PersistentCartCookieProvider::ACRIS_PERSISTENT_CART_TOKEN_COOKIE_NAME,
  49.                         $request->headers->get(PlatformRequest::HEADER_CONTEXT_TOKEN),
  50.                         time() + (PersistentCartCookieProvider::ACRIS_PERSISTENT_CART_COOKIE_EXPIRATION 60 60 24)
  51.                     )
  52.                 );
  53.                 // override sw cache hash cookie expire date
  54.                 if($request->cookies->has(CacheResponseSubscriber::CONTEXT_CACHE_COOKIE)) {
  55.                     $response->headers->setCookie(
  56.                         new Cookie(
  57.                             CacheResponseSubscriber::CONTEXT_CACHE_COOKIE,
  58.                             $request->cookies->get(CacheResponseSubscriber::CONTEXT_CACHE_COOKIE),
  59.                             time() + (PersistentCartCookieProvider::ACRIS_PERSISTENT_CART_COOKIE_EXPIRATION 60 60 24)
  60.                         )
  61.                     );
  62.                 }
  63.             } else {
  64.                 $response->headers->clearCookie(PersistentCartCookieProvider::ACRIS_PERSISTENT_CART_TOKEN_COOKIE_NAME);
  65.             }
  66.         }
  67.     }
  68.     public function setSessionToken()
  69.     {
  70.         $master $this->requestStack->getMasterRequest();
  71.         if (!$master) {
  72.             return;
  73.         }
  74.         if (!$master->attributes->get(SalesChannelRequest::ATTRIBUTE_IS_SALES_CHANNEL_REQUEST)) {
  75.             return;
  76.         }
  77.         if (!$master->hasSession()) {
  78.             return;
  79.         }
  80.         $session $master->getSession();
  81.         $applicationId $master->attributes->get(PlatformRequest::ATTRIBUTE_OAUTH_CLIENT_ID);
  82.         if (!$session->isStarted()) {
  83.             $session->setName('session-' $applicationId);
  84.             $session->start();
  85.             $session->set('sessionId'$session->getId());
  86.         }
  87.         $salesChannelId $master->attributes->get(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_ID);
  88.         if ($salesChannelId === null) {
  89.             /** @var SalesChannelContext|null $salesChannelContext */
  90.             $salesChannelContext $master->attributes->get(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_CONTEXT_OBJECT);
  91.             if ($salesChannelContext !== null) {
  92.                 $salesChannelId $salesChannelContext->getSalesChannel()->getId();
  93.             }
  94.         }
  95.         $token $master->cookies->get(PersistentCartCookieProvider::ACRIS_PERSISTENT_CART_TOKEN_COOKIE_NAME);
  96.         if(empty($token) !== true && (!$session->has(PlatformRequest::HEADER_CONTEXT_TOKEN) || $session->get(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_ID) !== $salesChannelId)) {
  97.             $master->headers->set(PlatformRequest::HEADER_CONTEXT_TOKEN$token);
  98.             $session->set(PlatformRequest::HEADER_CONTEXT_TOKEN$token);
  99.             $session->set(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_ID$salesChannelId);
  100.             $master->headers->set(
  101.                 PlatformRequest::HEADER_CONTEXT_TOKEN,
  102.                 $session->get(PlatformRequest::HEADER_CONTEXT_TOKEN)
  103.             );
  104.         }
  105.     }
  106. }