vendor/sulu/sulu/src/Sulu/Bundle/WebsiteBundle/EventListener/SegmentSubscriber.php line 67

Open in your IDE?
  1. <?php
  2. /*
  3. * This file is part of Sulu.
  4. *
  5. * (c) Sulu GmbH
  6. *
  7. * This source file is subject to the MIT license that is bundled
  8. * with this source code in the file LICENSE.
  9. */
  10. namespace Sulu\Bundle\WebsiteBundle\EventListener;
  11. use Sulu\Component\Webspace\Analyzer\RequestAnalyzerInterface;
  12. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  13. use Symfony\Component\HttpFoundation\Cookie;
  14. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  15. use Symfony\Component\HttpKernel\KernelEvents;
  16. class SegmentSubscriber implements EventSubscriberInterface
  17. {
  18. /**
  19. * @var string
  20. */
  21. private $segmentHeader;
  22. /**
  23. * @var RequestAnalyzerInterface
  24. */
  25. private $requestAnalyzer;
  26. /**
  27. * @var string
  28. */
  29. private $segmentCookieName;
  30. public function __construct(
  31. string $segmentHeader,
  32. RequestAnalyzerInterface $requestAnalyzer,
  33. string $segmentCookieName
  34. ) {
  35. $this->segmentHeader = $segmentHeader;
  36. $this->requestAnalyzer = $requestAnalyzer;
  37. $this->segmentCookieName = $segmentCookieName;
  38. }
  39. public static function getSubscribedEvents()
  40. {
  41. return [
  42. KernelEvents::RESPONSE => [
  43. ['addVaryHeader'],
  44. ['addCookieHeader'],
  45. ],
  46. ];
  47. }
  48. public function addVaryHeader(ResponseEvent $event)
  49. {
  50. $response = $event->getResponse();
  51. $webspace = $this->requestAnalyzer->getWebspace();
  52. if ($webspace && \count($webspace->getSegments())) {
  53. $response->setVary($this->segmentHeader, false);
  54. }
  55. }
  56. public function addCookieHeader(ResponseEvent $event)
  57. {
  58. $response = $event->getResponse();
  59. $webspace = $this->requestAnalyzer->getWebspace();
  60. $currentSegment = $this->requestAnalyzer->getSegment();
  61. $defaultSegment = $webspace ? $webspace->getDefaultSegment() : null;
  62. $defaultSegmentKey = $defaultSegment ? $defaultSegment->getKey() : null;
  63. $currentSegmentKey = $currentSegment ? $currentSegment->getKey() : $defaultSegmentKey;
  64. $cookieSegmentKey = $event->getRequest()->cookies->get($this->segmentCookieName) ?? $defaultSegmentKey;
  65. if ($currentSegmentKey !== $cookieSegmentKey) {
  66. $response->headers->setCookie(
  67. Cookie::create(
  68. $this->segmentCookieName,
  69. $defaultSegmentKey === $currentSegmentKey ? null : $currentSegmentKey
  70. )
  71. );
  72. }
  73. }
  74. }