src/EventSubscriber/PaginationRedirectSubscriber.php line 28

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  4. use Symfony\Component\HttpFoundation\RedirectResponse;
  5. use Symfony\Component\HttpKernel\Event\RequestEvent;
  6. use Symfony\Component\HttpKernel\KernelEvents;
  7. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  8. class PaginationRedirectSubscriber implements EventSubscriberInterface
  9. {
  10. private UrlGeneratorInterface $urlGenerator;
  11. public function __construct(UrlGeneratorInterface $urlGenerator)
  12. {
  13. $this->urlGenerator = $urlGenerator;
  14. }
  15. public static function getSubscribedEvents(): array
  16. {
  17. // On écoute l'événement REQUEST pour intervenir dès l'arrivée de l'utilisateur
  18. return [
  19. KernelEvents::REQUEST => ['onKernelRequest', 0],
  20. ];
  21. }
  22. public function onKernelRequest(RequestEvent $event): void
  23. {
  24. // On ignore les sous-requêtes (ex: rendus de fragments Twig)
  25. if (!$event->isMainRequest()) {
  26. return;
  27. }
  28. $request = $event->getRequest();
  29. $query = $request->query;
  30. // On vérifie si le paramètre "page" est présent et égal à "1"
  31. if ($query->has('page') && $query->get('page') === '1') {
  32. // On récupère le nom de la route actuelle (ex: app_prestataires)
  33. $route = $request->attributes->get('_route');
  34. if (!$route) {
  35. return;
  36. }
  37. // On récupère les paramètres de l'URL (ex: ?page=1&tri=nom)
  38. $allQueryParams = $query->all();
  39. // On supprime uniquement le paramètre page
  40. unset($allQueryParams['page']);
  41. // On récupère les variables de chemin (ex: {id} ou {slug})
  42. $routeParams = $request->attributes->get('_route_params', []);
  43. // On fusionne le tout pour reconstruire l'URL propre
  44. $finalParams = array_merge($routeParams, $allQueryParams);
  45. // Génération de l'URL sans le ?page=1
  46. $url = $this->urlGenerator->generate($route, $finalParams);
  47. // Envoi de la redirection 301 (Permanente)
  48. $event->setResponse(new RedirectResponse($url, 301));
  49. }
  50. }
  51. }