vendor/boldr/cms-bundle/src/EventSubscriber/CookieSubscriber.php line 49

Open in your IDE?
  1. <?php
  2. namespace Boldr\Cms\CmsBundle\EventSubscriber;
  3. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  4. use Symfony\Component\HttpKernel\Event\{ RequestEventResponseEvent };
  5. use Symfony\Component\HttpKernel\KernelEvents;
  6. use Symfony\Component\HttpFoundation\{ RequestCookie };
  7. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  8. use Boldr\Cms\CmsBundle\Cookies\CookieManager;
  9. class CookieSubscriber implements EventSubscriberInterface
  10. {
  11.     const COOKIE_NAME 'boldr_cms_cookie_preferences';
  12.     private ParameterBagInterface $parameterBag;
  13.     private CookieManager $cookieManager;
  14.     public function __construct(ParameterBagInterface $parameterBagCookieManager $cookieManager)
  15.     {
  16.         $this->cookieManager $cookieManager;
  17.         $this->parameterBag $parameterBag;
  18.     }
  19.     public static function getSubscribedEvents(): array
  20.     {
  21.         return [
  22.             KernelEvents::REQUEST => [['onKernelRequest'20]],
  23.             KernelEvents::RESPONSE => [['onKernelResponse']],
  24.         ];
  25.     }
  26.     public function onKernelRequest(RequestEvent $event)
  27.     {
  28.         $request $event->getRequest();
  29.         $preferences $this->parseCookieOptions($request);
  30.         $this->cookieManager->setAcceptsMarketingCookies($preferences['marketing_cookies']);
  31.         $this->cookieManager->setAcceptsAnalysisCookies($preferences['analysis_cookies']);
  32.         $this->cookieManager->setAcceptsPreferenceCookies($preferences['preference_cookies']);
  33.         if ($preferences['set'])
  34.         {
  35.             $this->cookieManager->markAsSet();
  36.         }
  37.     }
  38.     public function onKernelResponse(ResponseEvent $event)
  39.     {
  40.         $response $event->getResponse();
  41.         if (!$this->cookieManager->isSet())
  42.         {
  43.             return;
  44.         }
  45.         $newPreferences = [
  46.             'marketing_cookies' => $this->cookieManager->getAcceptsMarketingCookies(),
  47.             'analysis_cookies' => $this->cookieManager->getAcceptsAnalysisCookies(),
  48.             'preference_cookies' => $this->cookieManager->getAcceptsPreferenceCookies()
  49.         ];
  50.         $cookiePreferences $this->parseCookieOptions($event->getRequest());
  51.         if ($newPreferences !== $cookiePreferences)
  52.         {
  53.             $cookie = new Cookie(self::COOKIE_NAMEimplode(','array_keys(array_filter($newPreferences))), strtotime('next year'), '/'nullnullfalse);
  54.             $response->headers->setCookie($cookie);
  55.         }
  56.     }
  57.     private function parseCookieOptions(Request $request): array
  58.     {
  59.         $preferences = [
  60.             'marketing_cookies' => false,
  61.             'analysis_cookies' => false,
  62.             'preference_cookies' => false,
  63.             'set' => false
  64.         ];
  65.         if ($request->cookies->has(self::COOKIE_NAME))
  66.         {
  67.             $preferences['set'] = true;
  68.             $parts explode(','$request->cookies->get(self::COOKIE_NAME));
  69.             foreach ($parts as $part)
  70.             {
  71.                 $preferences[trim($part)] = true;
  72.             }
  73.         }
  74.         return $preferences;
  75.     }
  76. }