src/Controller/ForgotPasswordController.php line 18
<?phpnamespace App\Controller;use App\Repository\UserRepository;use Doctrine\ORM\EntityManagerInterface;use Symfony\Bridge\Twig\Mime\TemplatedEmail;use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;use Symfony\Component\HttpFoundation\Request;use Symfony\Component\HttpFoundation\Response;use Symfony\Component\Mailer\MailerInterface;use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;use Symfony\Component\Routing\Annotation\Route;class ForgotPasswordController extends AbstractController{#[Route('/forgot-password', name: 'app_forgot_password')]public function request(Request $request, UserRepository $userRepository, EntityManagerInterface $em, MailerInterface $mailer): Response{$sent = false;$error = null;if ($request->isMethod('POST')) {$email = trim($request->request->get('email', ''));$user = $userRepository->findOneBy(['email' => $email]);if ($user) {$token = bin2hex(random_bytes(32));$user->setResetToken($token);$user->setResetTokenExpiresAt(new \DateTimeImmutable('+1 hour'));$em->flush();$resetUrl = $this->generateUrl('app_reset_password', ['token' => $token], \Symfony\Component\Routing\Generator\UrlGeneratorInterface::ABSOLUTE_URL);$mail = (new TemplatedEmail())->from('info@b2bnaturamedicatrix.com')->to($user->getEmail())->subject('Réinitialisation de votre mot de passe')->htmlTemplate('emails/forgot_password.html.twig')->context(['reset_url' => $resetUrl,'user' => $user,]);$mailer->send($mail);}// Toujours afficher le même message pour ne pas révéler si l'email existe$sent = true;}return $this->render('forgot_password/request.html.twig', ['sent' => $sent,'error' => $error,]);}#[Route('/reset-password/{token}', name: 'app_reset_password')]public function reset(string $token, Request $request, UserRepository $userRepository, EntityManagerInterface $em, UserPasswordHasherInterface $passwordHasher): Response{$user = $userRepository->findOneBy(['resetToken' => $token]);if (!$user || !$user->getResetTokenExpiresAt() || $user->getResetTokenExpiresAt() < new \DateTimeImmutable()) {return $this->render('forgot_password/invalid_token.html.twig');}$error = null;if ($request->isMethod('POST')) {$password = $request->request->get('password', '');$confirm = $request->request->get('password_confirm', '');if (strlen($password) < 8) {$error = 'Le mot de passe doit contenir au moins 8 caractères.';} elseif ($password !== $confirm) {$error = 'Les mots de passe ne correspondent pas.';} else {$user->setPassword($passwordHasher->hashPassword($user, $password));$user->setGeneratePasswordRecovery($password);$user->setResetToken(null);$user->setResetTokenExpiresAt(null);$em->flush();$this->addFlash('success', 'Votre mot de passe a été réinitialisé. Vous pouvez vous connecter.');return $this->redirectToRoute('app_login');}}return $this->render('forgot_password/reset.html.twig', ['token' => $token,'error' => $error,]);}}