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

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.     /**
  13.      * @var string
  14.      */
  15.     private const ROUTE_NAME 'frontend.navigation.page';
  16.     /**
  17.      * @var SystemConfigService
  18.      */
  19.     private $systemConfigService;
  20.     public function __construct(SystemConfigService $systemConfigService)
  21.     {
  22.         $this->systemConfigService $systemConfigService;
  23.     }
  24.     public static function getSubscribedEvents(): array
  25.     {
  26.         return [
  27.             KernelEvents::REQUEST => [
  28.                 ['onRequest'],
  29.             ],
  30.         ];
  31.     }
  32.     public function onRequest(RequestEvent $event): void
  33.     {
  34.         $request $event->getRequest();
  35.         if (!$event->isMasterRequest()) {
  36.             return;
  37.         }
  38.         if (!$this->isNavigationRequest($request)) {
  39.             return;
  40.         }
  41.         if (!$this->shouldRedirect()) {
  42.             return;
  43.         }
  44.         if (!$request->attributes->has(SalesChannelRequest::ATTRIBUTE_CANONICAL_LINK)) {
  45.             return;
  46.         }
  47.         $canonical $request->attributes->get(SalesChannelRequest::ATTRIBUTE_CANONICAL_LINK);
  48.         $current $request->attributes->get(RequestTransformer::ATTRIBUTE_CURRENT_LINK);
  49.         if ($canonical === $current) {
  50.             // no redirect needed
  51.             return;
  52.         }
  53.         if ($request->getQueryString()) {
  54.             $canonical .= '?' $request->getQueryString();
  55.         }
  56.         $statusCode $this->getStatusCode();
  57.         $event->setResponse(new RedirectResponse($canonical$statusCode));
  58.     }
  59.     private function isNavigationRequest(Request $request): bool
  60.     {
  61.         return $request->attributes->get('_route') == self::ROUTE_NAME;
  62.     }
  63.     private function shouldRedirect(): bool
  64.     {
  65.         return $this->systemConfigService->getString('KielCodingPlatformTrailingSlash.config.method') === 'redirect';
  66.     }
  67.     private function getStatusCode(): int
  68.     {
  69.         return $this->systemConfigService->getInt('KielCodingPlatformTrailingSlash.config.redirectCode') ?: 301;
  70.     }
  71. }