src/Controller/ForgotPasswordController.php line 28

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Classe\Mail;
  4. use App\Repository\UserRepository;
  5. use App\Form\ResetPasswordFormType;
  6. use App\Form\ForgotPasswordFormType;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Symfony\Component\HttpFoundation\Response;
  11. use Symfony\Component\Routing\Annotation\Route;
  12. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  13. class ForgotPasswordController extends AbstractController
  14. {
  15. private $en;
  16. public function __construct(EntityManagerInterface $entityManager)
  17. {
  18. $this->en = $entityManager;
  19. }
  20. /**
  21. * @Route("/mot-de-passe-oublie", name="app_password")
  22. */
  23. public function index(Request $request, UserRepository $userRepository): Response
  24. {
  25. // 1. Création du formulaire
  26. $form = $this->createForm(ForgotPasswordFormType::class);
  27. $form->handleRequest($request);
  28. // 2. Traitement du formulaire
  29. if ($form->isSubmitted() && $form->isValid()) {
  30. // 3. Récupération des données
  31. $email = $form->get('email')->getData();
  32. $user = $userRepository->findOneByEmail($email);
  33. // 5. Si l'utilisateur existe, on envoie l'email
  34. if ($user) {
  35. $token = bin2hex(random_bytes(15));
  36. $user->setToken($token);
  37. $date = new \DateTime();
  38. $date->modify('+ 10 minutes');
  39. $user->setTokenExpireAt($date);
  40. $this->en->persist($user);
  41. $this->en->flush();
  42. $url = $this->generateUrl('app_password_update', ['token' => $token], UrlGeneratorInterface::ABSOLUTE_URL);
  43. $mail = new Mail();
  44. $vars = ['link' => $url];
  45. $mail->send(
  46. $user->getEmail(),
  47. $user->getFirstname().' '.$user->getLastName(),
  48. 'Modification de votre mot de passe - OKS-shop',
  49. 'forgotPassword.html',
  50. $vars
  51. );
  52. }
  53. }
  54. return $this->render('password/index.html.twig', [
  55. 'forgotPasswordForm' => $form->createView(),
  56. ]);
  57. }
  58. /**
  59. * @Route("/mot-de-passe/reset/{token}", name="app_password_update")
  60. */
  61. public function update(Request $request, UserRepository $userRepository, $token): Response
  62. {
  63. if (!$token) {
  64. return $this->redirectToRoute('app_password');
  65. }
  66. $user = $userRepository->findOneByToken($token);
  67. $now = new \DateTime();
  68. if (!$user || $user->getTokenExpireAt() < $now) {
  69. return $this->redirectToRoute('app_password');
  70. }
  71. $form = $this->createForm(ResetPasswordFormType::class, $user);
  72. $form->handleRequest($request);
  73. if ($form->isSubmitted() && $form->isValid()) {
  74. $user->setToken(null);
  75. $user->setTokenExpireAt(null);
  76. $this->en->flush();
  77. $this->addFlash(
  78. 'success',
  79. 'Votre mot de passe a bien été modifié !'
  80. );
  81. return $this->redirectToRoute('app_login');
  82. }
  83. return $this->render('password/reset.html.twig', [
  84. 'form' => $form->createView(),
  85. ]);
  86. }
  87. }