vendor/bitbag/wishlist-plugin/src/EventSubscriber/CreateNewWishlistSubscriber.php line 92

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file was created by developers working at BitBag
  4.  * Do you need more information about us and what we do? Visit our https://bitbag.io website!
  5.  * We are hiring developers from all over the world. Join us and start your new, exciting adventure and become part of us: https://bitbag.io/career
  6. */
  7. declare(strict_types=1);
  8. namespace BitBag\SyliusWishlistPlugin\EventSubscriber;
  9. use BitBag\SyliusWishlistPlugin\Entity\WishlistInterface;
  10. use BitBag\SyliusWishlistPlugin\Resolver\WishlistCookieTokenResolverInterface;
  11. use BitBag\SyliusWishlistPlugin\Resolver\WishlistsResolverInterface;
  12. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  13. use Symfony\Component\HttpFoundation\Cookie;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\HttpFoundation\RequestStack;
  16. use Symfony\Component\HttpKernel\Event\RequestEvent;
  17. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  18. use Symfony\Component\HttpKernel\KernelEvents;
  19. use Webmozart\Assert\Assert;
  20. final class CreateNewWishlistSubscriber implements EventSubscriberInterface
  21. {
  22.     private const ALLOWED_ENDPOINTS_PREFIX '/wishlist';
  23.     private string $wishlistCookieToken;
  24.     private WishlistsResolverInterface $wishlistsResolver;
  25.     private WishlistCookieTokenResolverInterface $wishlistCookieTokenResolver;
  26.     private ?Request $mainRequest null;
  27.     public function __construct(
  28.         string $wishlistCookieToken,
  29.         WishlistsResolverInterface $wishlistsResolver,
  30.         WishlistCookieTokenResolverInterface $wishlistCookieTokenResolver,
  31.         RequestStack $requestStack,
  32.     ) {
  33.         $this->wishlistCookieToken $wishlistCookieToken;
  34.         $this->wishlistsResolver $wishlistsResolver;
  35.         $this->wishlistCookieTokenResolver $wishlistCookieTokenResolver;
  36.         $this->mainRequest $requestStack->getMainRequest();
  37.     }
  38.     public static function getSubscribedEvents(): array
  39.     {
  40.         return [
  41.             KernelEvents::REQUEST => [['onKernelRequest'1]],
  42.             KernelEvents::RESPONSE => [['onKernelResponse'0]],
  43.         ];
  44.     }
  45.     public function onKernelRequest(RequestEvent $event): void
  46.     {
  47.         Assert::notNull($this->mainRequest'The class has to be used in HTTP context only');
  48.         if (!$event->isMainRequest()) {
  49.             return;
  50.         }
  51.         $currentPath $this->mainRequest->getPathInfo();
  52.         $isWishlistUrl str_starts_with($currentPathself::ALLOWED_ENDPOINTS_PREFIX);
  53.         if (!$isWishlistUrl) {
  54.             return;
  55.         }
  56.         /** @var WishlistInterface[] $wishlists */
  57.         $wishlists $this->wishlistsResolver->resolve();
  58.         $wishlistCookieToken $this->mainRequest->cookies->get($this->wishlistCookieToken);
  59.         if (!empty($wishlists)) {
  60.             if (null === $wishlistCookieToken) {
  61.                 $this->mainRequest->attributes->set($this->wishlistCookieTokenreset($wishlists)->getToken());
  62.             }
  63.             return;
  64.         }
  65.         if (null === $wishlistCookieToken) {
  66.             $wishlistCookieToken $this->wishlistCookieTokenResolver->resolve();
  67.         }
  68.         $this->mainRequest->attributes->set($this->wishlistCookieToken$wishlistCookieToken);
  69.     }
  70.     public function onKernelResponse(ResponseEvent $event): void
  71.     {
  72.         if (!$event->isMainRequest()) {
  73.             return;
  74.         }
  75.         $tokenWasGenerated $this->mainRequest->attributes->has($this->wishlistCookieToken);
  76.         $currentPath $this->mainRequest->getPathInfo();
  77.         $isWishlistUrl str_starts_with($currentPathself::ALLOWED_ENDPOINTS_PREFIX);
  78.         if (!$tokenWasGenerated && !$isWishlistUrl) {
  79.             return;
  80.         }
  81.         if ($this->mainRequest->cookies->has($this->wishlistCookieToken)) {
  82.             return;
  83.         }
  84.         $response $event->getResponse();
  85.         $wishlistCookieToken $this->mainRequest->attributes->get($this->wishlistCookieToken);
  86.         if (!$wishlistCookieToken) {
  87.             return;
  88.         }
  89.         $cookie = new Cookie($this->wishlistCookieToken$wishlistCookieTokenstrtotime('+1 year'));
  90.         $response->headers->setCookie($cookie);
  91.         $this->mainRequest->attributes->remove($this->wishlistCookieToken);
  92.     }
  93. }