src/StoreFront/Subscriber/StorefrontSubscriber.php line 38

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Bodymed\Webshop\StoreFront\Subscriber;
  4. use Bodymed\Webshop\StoreFront\Controller\BodymedIDController;
  5. use Shopware\Storefront\Event\StorefrontRenderEvent;
  6. use Shopware\Storefront\Page\Account\Login\AccountLoginPage;
  7. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  8. use Symfony\Component\HttpFoundation\RedirectResponse;
  9. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  10. use Symfony\Component\HttpKernel\KernelEvents;
  11. use Symfony\Component\Routing\Exception\RouteNotFoundException;
  12. use Symfony\Component\Routing\RouterInterface;
  13. class StorefrontSubscriber implements EventSubscriberInterface
  14. {
  15.     public function __construct(private RouterInterface $router)
  16.     {
  17.     }
  18.     public static function getSubscribedEvents(): array
  19.     {
  20.         return [
  21.             StorefrontRenderEvent::class => 'onStorefrontRender',
  22.             KernelEvents::RESPONSE => 'onBeforeSendResponse',
  23.         ];
  24.     }
  25.     /**
  26.      * @see https://madcode.atlassian.net/browse/BODYMED-884
  27.      *
  28.      * Nach dem Logout wird der User auf die Startseite geleitet, statt auf die Login-Seite.
  29.      * Hierfür wird die TargetUrl der Response von \Shopware\Storefront\Controller\AuthController::logout
  30.      * ersetzt durch die Startseite als Ziel
  31.      */
  32.     public function onBeforeSendResponse(ResponseEvent $event): void
  33.     {
  34.         if (!$event->isMainRequest()) {
  35.             return;
  36.         }
  37.         $request $event->getRequest();
  38.         $response $event->getResponse();
  39.         $route $request->attributes->get('_route'null);
  40.         if ($route === 'frontend.account.logout.page' and $response instanceof RedirectResponse) {
  41.             $targetUrl $this->router->generate('frontend.home.page');
  42.             $response->setTargetUrl($targetUrl);
  43.         }
  44.     }
  45.     /**
  46.      * @see https://madcode.atlassian.net/browse/BODYMED-737
  47.      *
  48.      * Prüft, ob der Query-Parameter *redirectTo* unerlaubte Zeichen hat,
  49.      * bevor diese auf der Login-Seite ausgegeben wird (XSS-Attacks verhindern)
  50.      * Anschließend wird versucht, aus dem bereinigten Parameter eine Route zu generieren.
  51.      *
  52.      * Wenn keine Route generiert werden kann, wird die Default-Route 'frontend.account.home.page'
  53.      * and die Seite durchgereicht.
  54.      */
  55.     public function onStorefrontRender(StorefrontRenderEvent $event): void
  56.     {
  57.         $parameters $event->getParameters();
  58.         if (isset($parameters['page'])) {
  59.             $page $parameters['page'];
  60.             if ($page instanceof AccountLoginPage) {
  61.                 if (isset($parameters['redirectTo'])) {
  62.                     $redirectToRoute \htmlspecialchars($parameters['redirectTo']);
  63.                     $redirectParameters = [];
  64.                     if (isset($parameters['redirectParameters'])) {
  65.                         $redirectParameters \json_decode($parameters['redirectParameters'], true);
  66.                     }
  67.                     try {
  68.                         $this->router->generate($redirectToRoute$redirectParameters);
  69.                     } catch (RouteNotFoundException $routeNotFoundException) {
  70.                         $redirectToRoute BodymedIDController::REDIRECT_DEFAULT_ROUTE;
  71.                         $event->setParameter('redirectTo'$redirectToRoute);
  72.                     }
  73.                 }
  74.             }
  75.         }
  76.     }
  77. }