vendor/dvdw/directory/src/Framework/Cache/CacheResponseSubscriber.php line 48

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace DvdwDirectory\Framework\Cache;
  3. use DvdwDirectory\Content\Product\Service\ProductCountService;
  4. use Shopware\Core\PlatformRequest;
  5. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  6. use Shopware\Core\System\SystemConfig\SystemConfigService;
  7. use Shopware\Storefront\Framework\Routing\MaintenanceModeResolver;
  8. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  9. use Symfony\Component\HttpFoundation\Cookie;
  10. use Symfony\Component\HttpFoundation\Request;
  11. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  12. use Symfony\Component\HttpKernel\KernelEvents;
  13. class CacheResponseSubscriber implements EventSubscriberInterface
  14. {
  15.     public const COOKIE_NAME 'pagesOrder';
  16.     private bool $httpCacheEnabled;
  17.     private MaintenanceModeResolver $maintenanceResolver;
  18.     private ProductCountService $productCountService;
  19.     private SystemConfigService $systemConfigService;
  20.     public function __construct(
  21.         bool $httpCacheEnabled,
  22.         MaintenanceModeResolver $maintenanceModeResolver,
  23.         ProductCountService $productCountService,
  24.         SystemConfigService $systemConfigService
  25.     )
  26.     {
  27.         $this->httpCacheEnabled $httpCacheEnabled;
  28.         $this->maintenanceResolver $maintenanceModeResolver;
  29.         $this->productCountService $productCountService;
  30.         $this->systemConfigService $systemConfigService;
  31.     }
  32.     public static function getSubscribedEvents(): iterable
  33.     {
  34.         return [KernelEvents::RESPONSE => [
  35.             ['setPagesOrderCookie', -1400],
  36.         ]];
  37.     }
  38.     public function setPagesOrderCookie(ResponseEvent $event): void
  39.     {
  40.         if (!$this->httpCacheEnabled) {
  41.             return;
  42.         }
  43.         $response $event->getResponse();
  44.         $request $event->getRequest();
  45.         if ($request->cookies->has(self::COOKIE_NAME)) {
  46.             return;
  47.         }
  48.         if ($this->maintenanceResolver->isMaintenanceRequest($request)) {
  49.             return;
  50.         }
  51.         $context $request->attributes->get(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_CONTEXT_OBJECT);
  52.         if (!$context instanceof SalesChannelContext) {
  53.             return;
  54.         }
  55.         $pagesArray range(1$this->getTotalPages($request$context));
  56.         shuffle($pagesArray);
  57.         $cookie Cookie::create(
  58.             self::COOKIE_NAME,
  59.             json_encode($pagesArray),
  60.             0,
  61.             '/',
  62.             null,
  63.             null,
  64.             false,
  65.             true
  66.         );
  67.         $cookie->setSecureDefault($request->isSecure());
  68.         $response->headers->setCookie($cookie);
  69.     }
  70.     private function getTotalPages(Request $requestSalesChannelContext $context): int
  71.     {
  72.         $limit $this->systemConfigService->getInt('core.listing.productsPerPage');
  73.         if ($limit <= 0) {
  74.             $limit 24;
  75.         }
  76.         $total $this->productCountService->getTotal($request$context);
  77.         if ($total <= 0) {
  78.             $total 1;
  79.         }
  80.         return (int) ceil($total $limit);
  81.     }
  82. }