vendor/ibexa/segmentation/src/lib/Event/Subscriber/SegmentPreviewSubscriber.php line 94

Open in your IDE?
  1. <?php
  2. /**
  3. * @copyright Copyright (C) Ibexa AS. All rights reserved.
  4. * @license For full copyright and license information view LICENSE file distributed with this source code.
  5. */
  6. declare(strict_types=1);
  7. namespace Ibexa\Segmentation\Event\Subscriber;
  8. use Ibexa\Contracts\Core\Repository\PermissionResolver;
  9. use Ibexa\Segmentation\Loader\UserSegmentsForcedLoadStrategy;
  10. use Ibexa\Segmentation\Loader\UserSegmentsLoadStrategyInterface;
  11. use Ibexa\Segmentation\Persistence\Handler\HandlerInterface;
  12. use Ibexa\Segmentation\Service\SegmentationService;
  13. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\HttpKernel\Event\ControllerEvent;
  16. use Symfony\Component\HttpKernel\Event\FinishRequestEvent;
  17. use Symfony\Component\HttpKernel\HttpKernelInterface;
  18. use Symfony\Component\HttpKernel\KernelEvents;
  19. /**
  20. * @internal
  21. */
  22. final class SegmentPreviewSubscriber implements EventSubscriberInterface
  23. {
  24. /** @var \Ibexa\Segmentation\Service\SegmentationService */
  25. private $segmentationService;
  26. /** @var \Ibexa\Segmentation\Persistence\Handler\HandlerInterface */
  27. private $handler;
  28. /** @var \Ibexa\Contracts\Core\Repository\PermissionResolver */
  29. private $permissionResolver;
  30. /** @var \Ibexa\Segmentation\Loader\UserSegmentsForcedLoadStrategy */
  31. private $userSegmentsLoadStrategy;
  32. /** @var \Ibexa\Segmentation\Loader\UserSegmentsLoadStrategyInterface|null */
  33. private $defaultUserSegmentsLoadStrategy;
  34. public function __construct(
  35. SegmentationService $segmentationService,
  36. HandlerInterface $handler,
  37. PermissionResolver $permissionResolver,
  38. UserSegmentsForcedLoadStrategy $userSegmentsLoadStrategy,
  39. ?UserSegmentsLoadStrategyInterface $defaultUserSegmentsLoadStrategy = null
  40. ) {
  41. $this->segmentationService = $segmentationService;
  42. $this->handler = $handler;
  43. $this->permissionResolver = $permissionResolver;
  44. $this->userSegmentsLoadStrategy = $userSegmentsLoadStrategy;
  45. $this->defaultUserSegmentsLoadStrategy = $defaultUserSegmentsLoadStrategy;
  46. }
  47. public static function getSubscribedEvents(): array
  48. {
  49. return [
  50. KernelEvents::CONTROLLER => ['onController', 255],
  51. KernelEvents::FINISH_REQUEST => ['onFinishRequest', 255],
  52. ];
  53. }
  54. public function onController(ControllerEvent $event): void
  55. {
  56. $request = $event->getRequest();
  57. if (!$this->isPageBuilderPreview($request, $event->getRequestType())) {
  58. return;
  59. }
  60. /** @var array{pagePreview: array{segmentId?: int}} $previewParameters */
  61. $previewParameters = $request->request->get('parameters', []);
  62. if (!isset($previewParameters['pagePreview']['segmentId'])) {
  63. return;
  64. }
  65. $userId = $this->permissionResolver->getCurrentUserReference()->getUserId();
  66. $previewSegmentId = (int) $previewParameters['pagePreview']['segmentId'];
  67. // configure strategy to return selected segment
  68. $previewSegment = $this->handler->loadSegmentById($previewSegmentId);
  69. $this->userSegmentsLoadStrategy->setSegments($userId, [$previewSegment]);
  70. // store default strategy for further rollback
  71. $this->defaultUserSegmentsLoadStrategy = $this->segmentationService->getUserSegmentsLoadStrategy();
  72. // reconfigure SegmentationService to use new strategy
  73. $this->segmentationService->setUserSegmentsLoadStrategy($this->userSegmentsLoadStrategy);
  74. }
  75. public function onFinishRequest(FinishRequestEvent $event): void
  76. {
  77. $request = $event->getRequest();
  78. if (null === $this->defaultUserSegmentsLoadStrategy) {
  79. return;
  80. }
  81. if (!$this->isPageBuilderPreview($request, $event->getRequestType())) {
  82. return;
  83. }
  84. // rollback old stategy
  85. $this->segmentationService->setUserSegmentsLoadStrategy($this->defaultUserSegmentsLoadStrategy);
  86. // cleanup
  87. $this->defaultUserSegmentsLoadStrategy = null;
  88. }
  89. private function isPageBuilderPreview(Request $request, int $requestType): bool
  90. {
  91. $routeName = $request->attributes->get('_route');
  92. return $requestType === HttpKernelInterface::MASTER_REQUEST
  93. && $routeName === 'ibexa.page_builder.block.siteaccess_preview';
  94. }
  95. }
  96. class_alias(SegmentPreviewSubscriber::class, 'Ibexa\Platform\Segmentation\Event\Subscriber\SegmentPreviewSubscriber');