src/EventSubscriber/CheckVerifiedUserSubscriber.php line 21

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Entity\Applicants;
  4. use App\Security\Exception\AccountNotVerifiedAuthenticationException;
  5. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  6. use Symfony\Component\HttpFoundation\RedirectResponse;
  7. use Symfony\Component\Routing\RouterInterface;
  8. use Symfony\Component\Security\Http\Event\CheckPassportEvent;
  9. use Symfony\Component\Security\Http\Event\LoginFailureEvent;
  10. class CheckVerifiedUserSubscriber implements EventSubscriberInterface
  11. {
  12.     private RouterInterface $router;
  13.     public function __construct(RouterInterface $router)
  14.     {
  15.         $this->router $router;
  16.     }
  17.     public function onCheckPassport(CheckPassportEvent $event): void
  18.     {
  19.         $passport $event->getPassport();
  20.         $user $passport->getUser();
  21.         if (!$user instanceof Applicants) {
  22.             return;
  23.         }
  24.         if (!$user->isEmailVerified()) {
  25.             throw new AccountNotVerifiedAuthenticationException(user$user);
  26.         }
  27.     }
  28.     public function onLoginFailure(LoginFailureEvent $event)
  29.     {
  30.         if (!$event->getException() instanceof AccountNotVerifiedAuthenticationException) {
  31.             return;
  32.         }
  33.         $exception $event->getException();
  34.         $response = new RedirectResponse(
  35.             $this->router->generate('applicant_register_confirm_email', ["email" => $exception->getUser()->getEmail()])
  36.         );
  37.         $event->setResponse($response);
  38.     }
  39.     public static function getSubscribedEvents()
  40.     {
  41.         return [
  42.             CheckPassportEvent::class => ['onCheckPassport', -10],
  43.             LoginFailureEvent::class => 'onLoginFailure',
  44.         ];
  45.     }
  46. }