<?php
declare(strict_types=0);
/*
* WellCommerce Foundation
*
* This file is part of the WellCommerce package.
*
* (c) Adam Piotrowski <adam@wellcommerce.org>, Adrian Potepa <adrian@wellcommerce.org>
*
* For the full copyright and license information,
* please view the LICENSE file that was distributed with this source code.
*/
namespace WellCommerce\Bundle\AppBundle\EventListener;
use Doctrine\ORM\QueryBuilder;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\KernelEvents;
use WellCommerce\Bundle\AppBundle\Entity\Redirect;
use WellCommerce\Bundle\CoreBundle\DependencyInjection\AbstractServiceSubscriber;
class RedirectSubscriber extends AbstractServiceSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return [
KernelEvents::REQUEST => 'onKernelRequest',
];
}
public function onKernelRequest(RequestEvent $event)
{
if ($event->getRequestType() == HttpKernelInterface::SUB_REQUEST) {
return;
}
if ($this->getRequestHelper()->isGraphQLRequest()) {
return;
}
if ($this->getSecurityHelper()->isActiveAdminFirewall()) {
return;
}
$request = $event->getRequest();
$queryString = $request->getQueryString();
$repository = $this->getEntityManager()->getRepository(Redirect::class);
if (false !== strpos($request->getRequestUri(), '/index.php')) {
$target = str_replace('/index.php', '', $request->getRequestUri());
$response = new RedirectResponse($target, Response::HTTP_MOVED_PERMANENTLY);
$event->setResponse($response);
return;
}
if (!empty($queryString) && strlen($queryString) > 5 && false === strpos($queryString, 'utm')) {
$redirect = $repository->findOneBy(['source' => '?' . $queryString]);
if ($redirect instanceof Redirect) {
$response = new RedirectResponse($redirect->getTarget(), $redirect->getStatus());
$event->setResponse($response);
}
}
$forcedRedirect = $this->getForcedRedirect($request);
if ($forcedRedirect instanceof Redirect) {
$response = new RedirectResponse($forcedRedirect->getTarget(), $forcedRedirect->getStatus());
$event->setResponse($response);
}
}
public function getForcedRedirect(Request $request): ?Redirect
{
$path = $request->getPathInfo();
$repository = $this->getEntityManager()->getRepository(Redirect::class);
/** @var QueryBuilder $queryBuilder */
$queryBuilder = $repository->createQueryBuilder('redirect');
$queryBuilder->andWhere('REGEXP(:path, redirect.source) = true');
$queryBuilder->andWhere($queryBuilder->expr()->eq('redirect.forced', true));
$queryBuilder->orderBy('redirect.hierarchy', 'ASC');
$queryBuilder->setMaxResults(1);
$queryBuilder->setParameter('path', $path);
$query = $queryBuilder->getQuery();
$result = $query->getOneOrNullResult();
return $result;
}
}