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

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 $requestint $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');