src/EventListener/RequestListener.php line 27

  1. <?php
  2. namespace App\EventListener;
  3. use Symfony\Component\HttpFoundation\RedirectResponse;
  4. use Symfony\Component\HttpFoundation\RequestStack;
  5. use Symfony\Component\HttpKernel\Event\RequestEvent;
  6. class RequestListener
  7. {
  8.     private RequestStack $requestStack;
  9.     /**
  10.      * @param RequestStack $requestStack
  11.      */
  12.     public function __construct(RequestStack $requestStack)
  13.     {
  14.         $this->requestStack $requestStack;
  15.     }
  16.     /**
  17.      * Redirect / to /de or /en or do nothing.
  18.      *
  19.      * @param RequestEvent $event
  20.      * @return void
  21.      */
  22.     public function onKernelRequest(RequestEvent $event): void
  23.     {
  24.         $request $event->getRequest();
  25.         $uri $request->getRequestUri();
  26.         // Automatically redirect ONLY for start page, means "/"
  27.         $redirectUris = [
  28.             '/',
  29.         ];
  30.         if (!in_array($uri$redirectUristrue)) {
  31.             // Do nothing if it is not start page "/"
  32.             // Let Sulu do the job (show 404 or redirect internally)
  33.             return;
  34.         }
  35.         $supportedLocales = [
  36.             'de',   # Default
  37.             'en',   # Secondary
  38.         ];
  39.         // Locale from browser - preferred language/locale --> "fr", "fr_FR", "vi", "en_US", ...
  40.         $localeFromBrowser $this->requestStack->getCurrentRequest()->getPreferredLanguage();
  41.         if (!empty($localeFromBrowser) && strlen($localeFromBrowser) >= 2) {
  42.             $localeFromBrowser substr($localeFromBrowser02);
  43.             // Redirect to /de or /en
  44.             if (in_array($localeFromBrowser$supportedLocalestrue)) {
  45.                 $event->setResponse(new RedirectResponse('/' $localeFromBrowser301));
  46.             }
  47.         }
  48.         // Otherwise let Sulu redirect internally to /de because de is default!
  49.     }
  50. }