vendor/connectholland/cookie-consent-bundle/EventSubscriber/CookieConsentFormSubscriber.php line 67

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. /*
  4. * This file is part of the ConnectHolland CookieConsentBundle package.
  5. * (c) Connect Holland.
  6. */
  7. namespace ConnectHolland\CookieConsentBundle\EventSubscriber;
  8. use ConnectHolland\CookieConsentBundle\Cookie\CookieHandler;
  9. use ConnectHolland\CookieConsentBundle\Cookie\CookieLogger;
  10. use ConnectHolland\CookieConsentBundle\Enum\CookieNameEnum;
  11. use ConnectHolland\CookieConsentBundle\Form\CookieConsentType;
  12. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  13. use Symfony\Component\Form\FormFactoryInterface;
  14. use Symfony\Component\Form\FormInterface;
  15. use Symfony\Component\HttpFoundation\Cookie;
  16. use Symfony\Component\HttpFoundation\Request;
  17. use Symfony\Component\HttpFoundation\Response;
  18. use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
  19. use Symfony\Component\HttpKernel\Event\KernelEvent;
  20. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  21. use Symfony\Component\HttpKernel\KernelEvents;
  22. class CookieConsentFormSubscriber implements EventSubscriberInterface
  23. {
  24. /**
  25. * @var FormFactoryInterface
  26. */
  27. private $formFactory;
  28. /**
  29. * @var CookieLogger
  30. */
  31. private $cookieLogger;
  32. /**
  33. * @var CookieHandler
  34. */
  35. private $cookieHandler;
  36. /**
  37. * @var bool
  38. */
  39. private $useLogger;
  40. public function __construct(FormFactoryInterface $formFactory, CookieLogger $cookieLogger, CookieHandler $cookieHandler, bool $useLogger)
  41. {
  42. $this->formFactory = $formFactory;
  43. $this->cookieLogger = $cookieLogger;
  44. $this->cookieHandler = $cookieHandler;
  45. $this->useLogger = $useLogger;
  46. }
  47. public static function getSubscribedEvents(): array
  48. {
  49. return [
  50. KernelEvents::RESPONSE => ['onResponse'],
  51. ];
  52. }
  53. /**
  54. * Checks if form has been submitted and saves users preferences in cookies by calling the CookieHandler.
  55. */
  56. public function onResponse(KernelEvent $event): void
  57. {
  58. if ($event instanceof FilterResponseEvent === false && $event instanceof ResponseEvent === false) {
  59. throw new \RuntimeException('No ResponseEvent class found');
  60. }
  61. $request = $event->getRequest();
  62. $response = $event->getResponse();
  63. $form = $this->createCookieConsentForm();
  64. $form->handleRequest($request);
  65. if ($form->isSubmitted() && $form->isValid()) {
  66. $this->handleFormSubmit($form->getData(), $request, $response);
  67. }
  68. }
  69. /**
  70. * Handle form submit.
  71. */
  72. protected function handleFormSubmit(array $categories, Request $request, Response $response): void
  73. {
  74. $cookieConsentKey = $this->getCookieConsentKey($request);
  75. $this->cookieHandler->save($categories, $cookieConsentKey, $response);
  76. if ($this->useLogger) {
  77. $this->cookieLogger->log($categories, $cookieConsentKey);
  78. }
  79. }
  80. /**
  81. * Return existing key from cookies or create new one.
  82. */
  83. protected function getCookieConsentKey(Request $request): string
  84. {
  85. return $request->cookies->get(CookieNameEnum::COOKIE_CONSENT_KEY_NAME) ?? uniqid();
  86. }
  87. /**
  88. * Create cookie consent form.
  89. */
  90. protected function createCookieConsentForm(): FormInterface
  91. {
  92. return $this->formFactory->create(CookieConsentType::class);
  93. }
  94. }