custom/plugins/KielCodingPlatformTrailingSlash/src/TrailingSlash/RequestSubscriber.php line 35

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace KielCodingPlatformTrailingSlash\TrailingSlash;
  3. use Shopware\Core\SalesChannelRequest;
  4. use Shopware\Core\System\SystemConfig\SystemConfigService;
  5. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  6. use Symfony\Component\HttpFoundation\RedirectResponse;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Symfony\Component\HttpKernel\Event\RequestEvent;
  9. use Symfony\Component\HttpKernel\KernelEvents;
  10. class RequestSubscriber implements EventSubscriberInterface
  11. {
  12.     private const ATTRIBUTE_SALES_CHANNEL_BASE_URL 'sw-sales-channel-base-url';
  13.     private const ROUTE_NAME_HOME 'frontend.home.page';
  14.     private const ROUTE_NAME_NAVIGATION 'frontend.navigation.page';
  15.     private SystemConfigService $systemConfigService;
  16.     public function __construct(SystemConfigService $systemConfigService)
  17.     {
  18.         $this->systemConfigService $systemConfigService;
  19.     }
  20.     public static function getSubscribedEvents(): array
  21.     {
  22.         return [
  23.             KernelEvents::REQUEST => [
  24.                 ['onRequest'],
  25.             ],
  26.         ];
  27.     }
  28.     public function onRequest(RequestEvent $event): void
  29.     {
  30.         $request $event->getRequest();
  31.         if (!$event->isMainRequest()) {
  32.             return;
  33.         }
  34.         if (!$this->isHomeRequest($request) && !$this->isNavigationRequest($request)) {
  35.             return;
  36.         }
  37.         if (!$this->shouldRedirect($request)) {
  38.             return;
  39.         }
  40.         if ($this->isHomeRequest($request)) {
  41.             // storefront pointing not on a sub folder
  42.             if ($request->attributes->get(self::ATTRIBUTE_SALES_CHANNEL_BASE_URL) == '') {
  43.                 return;
  44.             }
  45.             // storefront pointing on a sub folder
  46.             if (!$request->attributes->has(SalesChannelRequest::ATTRIBUTE_STOREFRONT_URL)) {
  47.                 return;
  48.             }
  49.             // prevent homepage redirect if disabled via plugin config
  50.             if ($this->preventHomepageRedirect($request)) {
  51.                 return;
  52.             }
  53.             $canonical $request->attributes->get(SalesChannelRequest::ATTRIBUTE_STOREFRONT_URL);
  54.             $current $request->attributes->get(RequestTransformer::ATTRIBUTE_CURRENT_LINK);
  55.         } elseif ($this->isNavigationRequest($request)) {
  56.             if (!$request->attributes->has(SalesChannelRequest::ATTRIBUTE_CANONICAL_LINK)) {
  57.                 return;
  58.             }
  59.             $canonical $request->attributes->get(SalesChannelRequest::ATTRIBUTE_CANONICAL_LINK);
  60.             $current $request->attributes->get(RequestTransformer::ATTRIBUTE_CURRENT_LINK);
  61.         } else {
  62.             return;
  63.         }
  64.         if ($canonical === $current) {
  65.             // no redirect needed
  66.             return;
  67.         }
  68.         if ($request->getQueryString()) {
  69.             $canonical .= '?' $request->getQueryString();
  70.         }
  71.         $statusCode $this->getStatusCode($request);
  72.         $event->setResponse(new RedirectResponse($canonical$statusCode));
  73.     }
  74.     private function isHomeRequest(Request $request): bool
  75.     {
  76.         return $request->attributes->get('_route') == self::ROUTE_NAME_HOME;
  77.     }
  78.     private function isNavigationRequest(Request $request): bool
  79.     {
  80.         return $request->attributes->get('_route') == self::ROUTE_NAME_NAVIGATION;
  81.     }
  82.     private function preventHomepageRedirect(Request $request): bool
  83.     {
  84.         $salesChannelId $request->attributes->get('sw-sales-channel-id');
  85.         return $this->systemConfigService->getBool('KielCodingPlatformTrailingSlash.config.preventHomepageRedirect'$salesChannelId);
  86.     }
  87.     private function shouldRedirect(Request $request): bool
  88.     {
  89.         $salesChannelId $request->attributes->get('sw-sales-channel-id');
  90.         return $this->systemConfigService->getString('KielCodingPlatformTrailingSlash.config.method'$salesChannelId) === 'redirect';
  91.     }
  92.     private function getStatusCode(Request $request): int
  93.     {
  94.         $salesChannelId $request->attributes->get('sw-sales-channel-id');
  95.         return $this->systemConfigService->getInt('KielCodingPlatformTrailingSlash.config.redirectCode'$salesChannelId) ?: 301;
  96.     }
  97. }