custom/plugins/CrayssnLabsBase/src/Storefront/Subscriber/RequestSubscriber.php line 68

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace CrayssnLabsBase\Storefront\Subscriber;
  3. use CrayssnLabsBase\Command\Util;
  4. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
  5. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  6. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter;
  7. use Shopware\Storefront\Framework\Routing;
  8. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  9. use Symfony\Component\HttpKernel;
  10. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  11. use Symfony\Component\HttpFoundation;
  12. /**
  13.  * Class OrderStateSubscriber
  14.  *
  15.  * @package   CrayssnLabsConfigurator\Storefront\Subscriber
  16.  *
  17.  * @author    Sebastian Ludwig <dev@cl.team>
  18.  * @copyright Copyright (c) 2022, CrayssnLabs Ludwig Wiegler GbR
  19.  */
  20. class RequestSubscriber implements EventSubscriberInterface
  21. {
  22.     /**
  23.      * @var \Shopware\Core\Framework\DataAbstractionLayer\EntityRepository
  24.      */
  25.     private EntityRepository $seoUrlRepository;
  26.     /**
  27.      * @var \Shopware\Storefront\Framework\Routing\Router
  28.      */
  29.     private Routing\Router $router;
  30.     /**
  31.      * @param \Shopware\Core\Framework\DataAbstractionLayer\EntityRepository $seoUrlRepository
  32.      * @param \Shopware\Storefront\Framework\Routing\Router                  $router
  33.      */
  34.     public function __construct(
  35.         EntityRepository $seoUrlRepository,
  36.         Routing\Router $router
  37.     )
  38.     {
  39.         $this->seoUrlRepository $seoUrlRepository;
  40.         $this->router $router;
  41.     }
  42.     /**
  43.      * Function getSubscribedEvents
  44.      *
  45.      * @return string[]
  46.      */
  47.     public static function getSubscribedEvents(): array
  48.     {
  49.         // Return the events to listen to as array like this:  <event to listen to> => <method to execute>
  50.         return [
  51.             HttpKernel\KernelEvents::RESPONSE => ['onResponse', -5]
  52.         ];
  53.     }
  54.     /**
  55.      * Function onResponse
  56.      *
  57.      * @param \Symfony\Component\HttpKernel\Event\ResponseEvent $event
  58.      */
  59.     public function onResponse(ResponseEvent $event)
  60.     {
  61.         if($event->getResponse()->getStatusCode() === HttpFoundation\Response::HTTP_NOT_FOUND)
  62.         {
  63.             $event->stopPropagation();
  64.             $response $event->getResponse();
  65.             $response->setStatusCode(301);
  66.             $uri trim($event->getRequest()->getRequestUri(), '/');
  67.             $uri Util::slugify($uri);
  68.             $uri str_replace('/''-'$uri);
  69.             $searchResult $this->seoUrlRepository->search((new Criteria())->addFilter(new Filter\EqualsFilter('seoPathInfo'$uri '/')), Util::getContext());
  70.             if($searchResult->count() > 0)
  71.             {
  72.                 $response->headers->set('location''/' $searchResult->first()->getSeoPathInfo());
  73.                 return;
  74.             }
  75.             $uri $this->router->generate('frontend.search.page', [
  76.                 'search' => str_replace(['/''-'], ' '$uri)
  77.             ]);
  78.             $response->headers->set('location'$uri);
  79.             $event->stopPropagation();
  80.         }
  81.     }
  82. }