src/EventSubscriber/ForgotPasswordEventSubscriber.php line 38

  1. <?php
  2. namespace App\EventSubscriber;
  3. use CoopTilleuls\ForgotPasswordBundle\Event\CreateTokenEvent;
  4. use CoopTilleuls\ForgotPasswordBundle\Event\UpdatePasswordEvent;
  5. use Doctrine\ORM\EntityManagerInterface;
  6. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  7. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  8. use Symfony\Component\HttpKernel\Exception\ServiceUnavailableHttpException;
  9. use Symfony\Component\Mailer\MailerInterface;
  10. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  11. final class ForgotPasswordEventSubscriber implements EventSubscriberInterface
  12. {
  13.     private $mailer;
  14.     private $em;
  15.     private $userPasswordHasher;
  16.     public function __construct(MailerInterface $mailerEntityManagerInterface $emUserPasswordHasherInterface $userPasswordHasher)
  17.     {
  18.         $this->mailer $mailer;
  19.         $this->em $em;
  20.         $this->userPasswordHasher $userPasswordHasher;
  21.     }
  22.     public static function getSubscribedEvents(): array
  23.     {
  24.         return [
  25.             // Symfony 4.3 and inferior, use 'coop_tilleuls_forgot_password.create_token' event name
  26.             CreateTokenEvent::class => 'onCreateToken',
  27.             UpdatePasswordEvent::class => 'onUpdatePassword',
  28.         ];
  29.     }
  30.     public function onCreateToken(CreateTokenEvent $event): void
  31.     {
  32.         $passwordToken $event->getPasswordToken();
  33.         $user $passwordToken->getUser();
  34.         $locale 'nl';
  35.         if ($user->getLocale()) {
  36.             $locale $user->getLocale();
  37.         }
  38.         switch ($locale) {
  39.             case 'de':
  40.                 $subject 'Setzen Sie Ihr Passwort zurück';
  41.             case 'en':
  42.                 $subject 'Reset your password';
  43.                 break;
  44.             default:
  45.                 $subject 'Reset je wachtwoord';
  46.                 break;
  47.         }
  48.         $message = (new TemplatedEmail());
  49.         $message->sender('noreply@mailgun.vaneckbv.nl');
  50.         $message->replyTo('info@vaneckbv.nl');
  51.         $message->from('Van Eck Bedrijfshygiene <info@vaneckbv.nl>');
  52.         $message->addTo($user->getEmail());
  53.         $message->subject($subject);
  54.         $message->htmlTemplate('Email/reset_password_' . (in_array($locale, ['nl','de','en']) ? $locale 'en') . '.html.twig');
  55.         $message->context([
  56.             'user' => $user,
  57.             'token' => sprintf($passwordToken->getToken()),
  58.             'locale' => $locale
  59.         ]);
  60.         try {
  61.             $this->mailer->send($message);
  62.         } catch (ServiceUnavailableHttpException $e) {
  63.             throw new ServiceUnavailableHttpException('sending_email_failed');
  64.             // dump($e->getMessage());
  65.         }
  66.     }
  67.     public function onUpdatePassword(UpdatePasswordEvent $event): void
  68.     {
  69.         $passwordToken $event->getPasswordToken();
  70.         $user $passwordToken->getUser();
  71.         $user->setPassword($this->userPasswordHasher->hashPassword($user$event->getPassword()));
  72.         $user->eraseCredentials();
  73.         $this->em->persist($user);
  74.         $this->em->flush();
  75.     }
  76. }