src/Controller/Security/ForgotPasswordController.php line 102

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Security;
  3. use App\Form\ForgotPasswordType;
  4. use App\Form\ResetPasswordFormType;
  5. use App\Repository\ClientRepository;
  6. use Doctrine\ORM\EntityManagerInterface;
  7. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  8. use Symfony\Component\HttpFoundation\Request;
  9. use Symfony\Component\HttpFoundation\RequestStack;
  10. use Symfony\Component\HttpFoundation\Response;
  11. use Symfony\Component\Routing\Annotation\Route;
  12. use Symfony\Component\Mailer\MailerInterface;
  13. use Symfony\Component\Mime\Email;
  14. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  15. use Symfony\Component\Routing\RouterInterface;
  16. use Symfony\Component\Uid\Uuid;
  17. class ForgotPasswordController extends AbstractController
  18. {
  19.     private RouterInterface $router;
  20.     private RequestStack $requestStack;
  21.     public function __construct(
  22.         ClientRepository $clientRepository,
  23.         RouterInterface $router,
  24.         RequestStack $requestStack,
  25.         EntityManagerInterface $entityManager
  26.     )
  27.     {
  28.         $this->clientRepository $clientRepository;
  29.         $this->router $router;
  30.         $this->requestStack $requestStack;
  31.         $this->entityManager $entityManager;
  32.     }
  33.     /**
  34.      * @throws \Symfony\Component\Mailer\Exception\TransportExceptionInterface
  35.      */
  36.     #[Route('/mot-de-passe-oublie'name'app_forgot_password')]
  37.     public function request(Request $requestMailerInterface $mailer): Response
  38.     {
  39.         $form $this->createForm(ForgotPasswordType::class);
  40.         $form->handleRequest($request);
  41.         if ($form->isSubmitted() && $form->isValid()) {
  42.             $email $form->get('email')->getData();
  43.             $client $this->clientRepository->findOneBy(['email' => $email]);
  44.             if ($client) {
  45.                 // Générer un token unique
  46.                 $resetToken Uuid::v4()->toRfc4122();
  47.                 $client->setResetToken($resetToken);
  48.                 $client->setResetTokenExpiresAt(new \DateTime('+1 hour'));
  49.                 $this->entityManager->flush();
  50.                 // Récupérer la requête courante pour extraire le port
  51.                 $request $this->requestStack->getCurrentRequest();
  52.                 $host $request->getHost();
  53.                 $scheme $request->getScheme();
  54.                 $port $request->getPort();
  55.                 // Générer l'URL absolue avec le bon token
  56.                 $resetUrl $this->router->generate(
  57.                     'app_reset_password',
  58.                     ['token' => $resetToken],  // Utiliser le token généré
  59.                     UrlGeneratorInterface::ABSOLUTE_URL
  60.                 );
  61.                 // Ajouter le port uniquement si nécessaire
  62.                 if ($port && strpos($resetUrl":$port") === false) {
  63.                     $resetUrl preg_replace("/^($scheme:\/\/$host)/""$1:$port"$resetUrl);
  64.                 }
  65.                 $email = (new Email())
  66.                     ->from('contact@panda-coworking.com'// Adresse expéditeur
  67.                     ->to($client->getEmail()) // Adresse du client (destinataire)
  68.                     ->subject('Réinitialisation de votre mot de passe'// Sujet
  69.                     ->html// Contenu HTML
  70.                         "<p>Bonjour,</p>
  71.                              <p>Cliquez sur le lien suivant pour réinitialiser votre mot de passe :</p>
  72.                              <a href='$resetUrl'>$resetUrl</a>"
  73.                     );
  74.                 // Envoi de l'email
  75.                 try {
  76.                     $mailer->send($email);
  77.                 } catch (\Exception $e) {
  78.                     return new Response('Échec de l\'envoi de l\'e-mail : ' $e->getMessage());
  79.                 }
  80.                 // Message de succès
  81.                 $this->addFlash('success''Un email a été envoyé pour réinitialiser votre mot de passe.');
  82.             }
  83.             return $this->redirectToRoute('app_forgot_password');
  84.         }
  85.         return $this->render('security/forgot_password.html.twig', [
  86.             'form' => $form->createView(),
  87.             'path_name'=>'app_forgot_password',
  88.         ]);
  89.     }
  90.     #[Route('/reinitialisation-mot-de-passe/{token}'name'app_reset_password')]
  91.     public function reset(Request $requeststring $token): Response
  92.     {
  93.         // Récupérer le client via le token
  94.         $client $this->clientRepository->findOneBy(['resetToken' => $token]);
  95.         if (!$client || $client->getResetTokenExpiresAt() < new \DateTime()) {
  96.             // Gérer l'erreur si le token est invalide ou expiré
  97.             return $this->redirectToRoute('app_forgot_password');
  98.         }
  99.         // Créer et gérer le formulaire de réinitialisation du mot de passe
  100.         $form $this->createForm(ResetPasswordFormType::class);
  101.         $form->handleRequest($request);
  102.         if ($form->isSubmitted() && $form->isValid()) {
  103.             // Récupérer le nouveau mot de passe
  104.             $newPassword $form->get('password')->getData();
  105.             // Hacher le mot de passe avec password_hash()
  106.             $hashedPassword password_hash($newPasswordPASSWORD_BCRYPT);
  107.             $client->setPassword($hashedPassword);
  108.             $client->setResetToken(null); // Réinitialiser le token
  109.             // Sauvegarder le client avec son nouveau mot de passe
  110.             $this->entityManager->flush();
  111.             // Ajouter un message flash et rediriger
  112.             $this->addFlash('success''Votre mot de passe a été réinitialisé avec succès.');
  113.             return $this->redirectToRoute('login');
  114.         }
  115.         return $this->render('security/reset_password.html.twig', [
  116.             'form' => $form->createView(),
  117.             'path_name' => 'app_reset_password'
  118.         ]);
  119.     }
  120. }