src/WellCommerce/Bundle/AppBundle/EventListener/RedirectSubscriber.php line 57

Open in your IDE?
  1. <?php
  2. declare(strict_types=0);
  3. /*
  4.  * WellCommerce Foundation
  5.  *
  6.  * This file is part of the WellCommerce package.
  7.  *
  8.  * (c) Adam Piotrowski <adam@wellcommerce.org>, Adrian Potepa <adrian@wellcommerce.org>
  9.  *
  10.  * For the full copyright and license information,
  11.  * please view the LICENSE file that was distributed with this source code.
  12.  */
  13. namespace WellCommerce\Bundle\AppBundle\EventListener;
  14. use Doctrine\ORM\QueryBuilder;
  15. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  16. use Symfony\Component\HttpFoundation\RedirectResponse;
  17. use Symfony\Component\HttpFoundation\Request;
  18. use Symfony\Component\HttpFoundation\Response;
  19. use Symfony\Component\HttpKernel\Event\RequestEvent;
  20. use Symfony\Component\HttpKernel\HttpKernelInterface;
  21. use Symfony\Component\HttpKernel\KernelEvents;
  22. use WellCommerce\Bundle\AppBundle\Entity\Redirect;
  23. use WellCommerce\Bundle\CoreBundle\DependencyInjection\AbstractServiceSubscriber;
  24. class RedirectSubscriber extends AbstractServiceSubscriber implements EventSubscriberInterface
  25. {
  26.     public static function getSubscribedEvents()
  27.     {
  28.         return [
  29.             KernelEvents::REQUEST => 'onKernelRequest',
  30.         ];
  31.     }
  32.     public function onKernelRequest(RequestEvent $event)
  33.     {
  34.         if ($event->getRequestType() == HttpKernelInterface::SUB_REQUEST) {
  35.             return;
  36.         }
  37.         if ($this->getRequestHelper()->isGraphQLRequest()) {
  38.             return;
  39.         }
  40.         if ($this->getSecurityHelper()->isActiveAdminFirewall()) {
  41.             return;
  42.         }
  43.         $request     $event->getRequest();
  44.         $queryString $request->getQueryString();
  45.         $repository  $this->getEntityManager()->getRepository(Redirect::class);
  46.         if (false !== strpos($request->getRequestUri(), '/index.php')) {
  47.             $target   str_replace('/index.php'''$request->getRequestUri());
  48.             $response = new RedirectResponse($targetResponse::HTTP_MOVED_PERMANENTLY);
  49.             $event->setResponse($response);
  50.             return;
  51.         }
  52.         if (!empty($queryString) && strlen($queryString) > && false === strpos($queryString'utm')) {
  53.             $redirect $repository->findOneBy(['source' => '?' $queryString]);
  54.             if ($redirect instanceof Redirect) {
  55.                 $response = new RedirectResponse($redirect->getTarget(), $redirect->getStatus());
  56.                 $event->setResponse($response);
  57.             }
  58.         }
  59.         $forcedRedirect $this->getForcedRedirect($request);
  60.         if ($forcedRedirect instanceof Redirect) {
  61.             $response = new RedirectResponse($forcedRedirect->getTarget(), $forcedRedirect->getStatus());
  62.             $event->setResponse($response);
  63.         }
  64.     }
  65.     public function getForcedRedirect(Request $request): ?Redirect
  66.     {
  67.         $path       $request->getPathInfo();
  68.         $repository $this->getEntityManager()->getRepository(Redirect::class);
  69.         /** @var QueryBuilder $queryBuilder */
  70.         $queryBuilder $repository->createQueryBuilder('redirect');
  71.         $queryBuilder->andWhere('REGEXP(:path, redirect.source) = true');
  72.         $queryBuilder->andWhere($queryBuilder->expr()->eq('redirect.forced'true));
  73.         $queryBuilder->orderBy('redirect.hierarchy''ASC');
  74.         $queryBuilder->setMaxResults(1);
  75.         $queryBuilder->setParameter('path'$path);
  76.         $query  $queryBuilder->getQuery();
  77.         $result $query->getOneOrNullResult();
  78.         return $result;
  79.     }
  80. }