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

Open in your IDE?
  1. <?php
  2. namespace Boldr\Cms\CmsBundle\EventSubscriber;
  3. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  4. use Symfony\Component\HttpKernel\Event\{ RequestEvent, ResponseEvent };
  5. use Symfony\Component\HttpKernel\KernelEvents;
  6. use Symfony\Component\HttpFoundation\{ Request, Cookie };
  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 $parameterBag, CookieManager $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_NAME, implode(',', array_keys(array_filter($newPreferences))), strtotime('next year'), '/', null, null, false);
  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. }