src/Controller/ResetPasswordController.php line 41
<?phpnamespace App\Controller;use App\Entity\User;use App\Form\ChangePasswordFormType;use App\Form\ResetPasswordRequestFormType;use App\Session\FlashMessageInterface;use Doctrine\ORM\EntityManagerInterface;use Symfony\Bridge\Twig\Mime\TemplatedEmail;use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;use Symfony\Component\HttpFoundation\RedirectResponse;use Symfony\Component\HttpFoundation\Request;use Symfony\Component\HttpFoundation\Response;use Symfony\Component\Mailer\Exception\TransportExceptionInterface;use Symfony\Component\Mailer\MailerInterface;use Symfony\Component\Mime\Address;use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;use Symfony\Component\Routing\Annotation\Route;use Symfony\Contracts\Translation\TranslatorInterface;use SymfonyCasts\Bundle\ResetPassword\Controller\ResetPasswordControllerTrait;use SymfonyCasts\Bundle\ResetPassword\Exception\ResetPasswordExceptionInterface;use SymfonyCasts\Bundle\ResetPassword\ResetPasswordHelperInterface;#[Route('/reset-password')]class ResetPasswordController extends AbstractController{use ResetPasswordControllerTrait;public function __construct(private readonly ResetPasswordHelperInterface $resetPasswordHelper,private readonly EntityManagerInterface $entityManager) {}/*** Display & process form to request a password reset.*/#[Route('/', name: 'app_reset_password_request')]public function request(Request $request, MailerInterface $mailer, TranslatorInterface $translator): Response{$form = $this->createForm(ResetPasswordRequestFormType::class);$form->handleRequest($request);if ($form->isSubmitted() && $form->isValid()) {return $this->processSendingPasswordResetEmail($form->get('email')->getData(),$mailer,$translator);}return $this->render('reset_password/request.html.twig', ['requestForm' => $form->createView(),]);}/*** Confirmation page after a user has requested a password reset.*/#[Route('/check-email', name: 'app_reset_password_check_email')]public function checkEmail(): Response{if (null === ($resetToken = $this->getTokenObjectFromSession())) {$resetToken = $this->resetPasswordHelper->generateFakeResetToken();}return $this->render('reset_password/check_email.html.twig', ['resetToken' => $resetToken,]);}/*** Validates and process the reset URL that the user clicked in their email.*/#[Route('/reset/{token}', name: 'app_reset_password_reset')]public function reset(Request $request, UserPasswordHasherInterface $hasher, string $token = null): Response {if ($token) {// We store the token in session and remove it from the URL, to avoid the URL being// loaded in a browser and potentially leaking the token to 3rd party JavaScript.$this->storeTokenInSession($token);return $this->redirectToRoute('app_reset_password_reset');}$token = $this->getTokenFromSession();if (null === $token) {throw $this->createNotFoundException('No reset password token found in the URL or in the session.');}try {$user = $this->resetPasswordHelper->validateTokenAndFetchUser($token);} catch (ResetPasswordExceptionInterface $e) {$this->addFlash(FlashMessageInterface::ERROR,sprintf('There was a problem validating your reset request - %s',$e->getReason()));return $this->redirectToRoute('app_reset_password_request');}// The token is valid; allow the user to change their password.$form = $this->createForm(ChangePasswordFormType::class);$form->handleRequest($request);if ($form->isSubmitted() && $form->isValid() && ($user instanceof User)) {$this->resetPasswordHelper->removeResetRequest($token);$encodedPassword = $hasher->hashPassword($user,$form->get('plainPassword')->getData());$user->setPassword($encodedPassword);$this->entityManager->flush();$this->cleanSessionAfterReset();return $this->redirectToRoute('app_gestion_dashboard_index');}return $this->render('reset_password/reset.html.twig', ['resetForm' => $form->createView(),]);}private function processSendingPasswordResetEmail(string $emailData,MailerInterface $mailer,TranslatorInterface $translator): RedirectResponse {$user = $this->entityManager->getRepository(User::class)->findOneBy(['email' => $emailData,]);// Do not reveal whether a user account was found or not.if (!$user) {return $this->redirectToRoute('app_reset_password_check_email');}try {$resetToken = $this->resetPasswordHelper->generateResetToken($user);} catch (ResetPasswordExceptionInterface $e) {$this->addFlash(FlashMessageInterface::ERROR,sprintf('There was a problem handling your password reset request - %s',$e->getReason()));return $this->redirectToRoute('app_reset_password_check_email');}$email = (new TemplatedEmail())->to($user->getEmail())->subject($translator->trans('Your password reset request'))->htmlTemplate('mail/reset_password/email.html.twig')->context(['resetToken' => $resetToken,'expirationDate' => $resetToken->getExpiresAt(),]);try {$mailer->send($email);} catch (TransportExceptionInterface $e) {$this->addFlash(FlashMessageInterface::ERROR,sprintf('Sending message failed - %s',$e->getMessage()));}$this->setTokenObjectInSession($resetToken);return $this->redirectToRoute('app_reset_password_check_email');}}