<?php
namespace App\EventSubscriber;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class PaginationRedirectSubscriber implements EventSubscriberInterface
{
private UrlGeneratorInterface $urlGenerator;
public function __construct(UrlGeneratorInterface $urlGenerator)
{
$this->urlGenerator = $urlGenerator;
}
public static function getSubscribedEvents(): array
{
// On écoute l'événement REQUEST pour intervenir dès l'arrivée de l'utilisateur
return [
KernelEvents::REQUEST => ['onKernelRequest', 0],
];
}
public function onKernelRequest(RequestEvent $event): void
{
// On ignore les sous-requêtes (ex: rendus de fragments Twig)
if (!$event->isMainRequest()) {
return;
}
$request = $event->getRequest();
$query = $request->query;
// On vérifie si le paramètre "page" est présent et égal à "1"
if ($query->has('page') && $query->get('page') === '1') {
// On récupère le nom de la route actuelle (ex: app_prestataires)
$route = $request->attributes->get('_route');
if (!$route) {
return;
}
// On récupère les paramètres de l'URL (ex: ?page=1&tri=nom)
$allQueryParams = $query->all();
// On supprime uniquement le paramètre page
unset($allQueryParams['page']);
// On récupère les variables de chemin (ex: {id} ou {slug})
$routeParams = $request->attributes->get('_route_params', []);
// On fusionne le tout pour reconstruire l'URL propre
$finalParams = array_merge($routeParams, $allQueryParams);
// Génération de l'URL sans le ?page=1
$url = $this->urlGenerator->generate($route, $finalParams);
// Envoi de la redirection 301 (Permanente)
$event->setResponse(new RedirectResponse($url, 301));
}
}
}