<?php
namespace App\Service\EventListener;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Routing\Exception\MethodNotAllowedException;
use Symfony\Component\Routing\Exception\NoConfigurationException;
use Symfony\Component\Routing\Exception\ResourceNotFoundException;
use Symfony\Component\Routing\RouterInterface;
class Redirect404Listener implements EventSubscriberInterface
{
private RouterInterface $router;
public function __construct(RouterInterface $router)
{
$this->router = $router;
}
public function redirect(ExceptionEvent $event): void
{
$exception = $event->getThrowable();
if (!$exception instanceof NotFoundHttpException) {
return;
}
$newRoute['_route'] = 'index';
// Redirect know old urls to /lv/old-url
if ($exception->getPrevious() instanceof ResourceNotFoundException) {
try {
$newRoute = $this->router->match(
sprintf(
'/%s%s',
$event->getRequest()->getDefaultLocale(),
$event->getRequest()->getRequestUri()
)
);
} catch (ResourceNotFoundException|NoConfigurationException|MethodNotAllowedException $notFoundException) {}
}
$response = new RedirectResponse($this->router->generate($newRoute['_route']));
$event->setResponse($response);
}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::EXCEPTION => [
'redirect',
],
];
}
}