src/EventSubscriber/PasswordChangeSubscriber.php line 30

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  4. use Symfony\Component\HttpKernel\Event\ControllerEvent;
  5. use Symfony\Component\HttpKernel\KernelEvents;
  6. use Symfony\Component\HttpFoundation\RedirectResponse;
  7. use Symfony\Component\Routing\RouterInterface;
  8. use Symfony\Component\Security\Core\Security;
  9. class PasswordChangeSubscriber implements EventSubscriberInterface
  10. {
  11.     private $security;
  12.     private $router;
  13.     public function __construct(Security $securityRouterInterface $router)
  14.     {
  15.         $this->security $security;
  16.         $this->router $router;
  17.     }
  18.     public static function getSubscribedEvents(): array
  19.     {
  20.         return [
  21.             KernelEvents::CONTROLLER => 'onKernelController',
  22.         ];
  23.     }
  24.     public function onKernelController(ControllerEvent $event): void
  25.     {
  26.         // ðŸš« Ignore les sous-requêtes (très important)
  27.         if (!$event->isMainRequest()) {
  28.             return;
  29.         }
  30.         $request $event->getRequest();
  31.         $route   $request->attributes->get('_route');
  32.         $user    $this->security->getUser();
  33.         // ðŸš« Si pas connecté â†’ ne rien faire
  34.         if (!$user) {
  35.             return;
  36.         }
  37.         // âœ… Si le mot de passe a déjà Ã©té changé â†’ OK
  38.         if ($user->isPasswordChanged()) {
  39.             return;
  40.         }
  41.         // ðŸš« Si route non définie (par ex. pour un asset) â†’ ignorer
  42.         if (!$route) {
  43.             return;
  44.         }
  45.         // ðŸš« Si on est sur les routes autorisées â†’ ignorer
  46.         $excludedRoutes = [
  47.             'app_user_change_password'// route du changement
  48.             'login',
  49.             'logout',
  50.             '_wdt',       // Web Debug Toolbar
  51.             '_profiler',  // Profiler
  52.             '_errors',    // gestion des erreurs internes
  53.         ];
  54.         foreach ($excludedRoutes as $prefix) {
  55.             if (strpos($route$prefix) === 0) {
  56.                 return;
  57.             }
  58.         }
  59.         // âœ… Redirige uniquement si on n’est pas déjà sur la bonne page
  60.         $response = new RedirectResponse($this->router->generate('app_user_change_password'));
  61.         $event->setController(fn() => $response);
  62.     }
  63. }