src/EventSubscriber/CheckVerifiedUserSubscriber.php line 31

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  4. use Symfony\Component\Security\Http\Event\LoginFailureEvent;
  5. use Symfony\Component\HttpFoundation\RedirectResponse;
  6. use App\Security\EmailNotVerifiedAuthenticationException;
  7. use Symfony\Component\Routing\RouterInterface;
  8. use Symfony\Component\Security\Http\Event\CheckPassportEvent;
  9. use Symfony\Component\Security\Http\Authenticator\Passport\UserPassportInterface;
  10. use App\Entity\User;
  11. use App\Security\EmailVerifier;
  12. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  13. use Symfony\Component\Mime\Address;
  14. use Symfony\Contracts\Translation\TranslatorInterface;
  15. class CheckVerifiedUserSubscriber implements EventSubscriberInterface
  16. {
  17.     private RouterInterface $router;
  18.     private EmailVerifier $emailVerifier;
  19.     private $translator;
  20.     public function __construct(RouterInterface $routerEmailVerifier $emailVerifierTranslatorInterface $translator)
  21.     {
  22.         $this->router $router;
  23.         $this->emailVerifier $emailVerifier;
  24.         $this->translator $translator;
  25.     }
  26.     public function onCheckPassport(CheckPassportEvent $event)
  27.     {
  28.         $passport $event->getPassport();
  29.         if (!$passport instanceof UserPassportInterface) {
  30.             throw new \Exception('Unexpected passport type');
  31.         }
  32.         $user $passport->getUser();
  33.         if (!$user instanceof User) {
  34.             throw new \Exception('Unexpected user type');
  35.         }
  36.         if ($user->isVerified()) {
  37.             return;
  38.         }
  39.         // generate a signed url and email it to the user
  40.         $this->emailVerifier->sendEmailConfirmation('app_verify_email'$user,
  41.             (new TemplatedEmail())
  42.                 ->from(new Address('amb@clubtickets.com''Ambassadors'))
  43.                 ->to($user->getEmail())
  44.                 ->subject($this->translator->trans('preuser.verify.email.subject'))
  45.                 ->htmlTemplate('registration/confirmation_email.html.twig')
  46.         );
  47.         
  48.         throw new EmailNotVerifiedAuthenticationException();
  49.     }
  50.     public function onLoginFailure(LoginFailureEvent $event)
  51.     {
  52.         if (!$event->getException() instanceof EmailNotVerifiedAuthenticationException) {
  53.             return;
  54.         }
  55.         $response = new RedirectResponse(
  56.             $this->router->generate('app_verify_check')
  57.         );
  58.         $event->setResponse($response);
  59.     }
  60.     public static function getSubscribedEvents()
  61.     {
  62.         return [
  63.             CheckPassportEvent::class => ['onCheckPassport', -10],
  64.             LoginFailureEvent::class => 'onLoginFailure'
  65.         ];
  66.     }
  67. }