src/Controller/Security/ResetPasswordController.php line 44

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Security;
  3. use App\Entity\User;
  4. use App\Repository\UserRepository;
  5. use App\Service\EmailService;
  6. use Doctrine\ORM\EntityManagerInterface;
  7. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  8. use Symfony\Component\Form\Extension\Core\Type\HiddenType;
  9. use Symfony\Component\Form\Extension\Core\Type\PasswordType;
  10. use Symfony\Component\Form\Extension\Core\Type\SubmitType;
  11. use Symfony\Component\Form\Extension\Core\Type\TextType;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\HttpFoundation\Response;
  14. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  15. use Symfony\Component\Routing\Annotation\Route;
  16. use Symfony\Component\Uid\Uuid;
  17. /**
  18. * @Route("/passwort-zuruecksetzen")
  19. */
  20. class ResetPasswordController extends AbstractController {
  21. /** @var EntityManagerInterface */
  22. private $entityManager;
  23. /** @var UserRepository */
  24. private $userRepository;
  25. /**
  26. * @var EmailService
  27. */
  28. private $emailService;
  29. public function __construct(EntityManagerInterface $entityManager, UserRepository $userRepository, EmailService $emailService) {
  30. $this->entityManager = $entityManager;
  31. $this->userRepository = $userRepository;
  32. $this->emailService = $emailService;
  33. }
  34. /**
  35. * @Route("/anfrage", name="app_forgot_password_request")
  36. */
  37. public function requestPasswordReset(Request $request): Response {
  38. $form = $this->createFormBuilder()
  39. ->add('email', TextType::class, [
  40. 'label' => 'Deine E-Mail Adresse',
  41. 'attr' => [
  42. 'class' => 'border-accent form-control',
  43. 'placeholder' => 'Deine E-Mail Adresse',
  44. ],
  45. ])
  46. ->add('submit', SubmitType::class, [
  47. 'label' => 'Passwort zurücksetzen',
  48. 'attr' => [
  49. 'class' => 'button accent',
  50. ],
  51. ])
  52. ->getForm();
  53. $form->handleRequest($request);
  54. if ($form->isSubmitted() && $form->isValid()) {
  55. /** @var array<string> */
  56. $data = $form->getData();
  57. /** @var User */
  58. $user = $this->userRepository->findOneBy([
  59. 'email' => $data['email'],
  60. ]);
  61. if ($user instanceof User) {
  62. $user->setPasswordResetToken(Uuid::v6());
  63. $user->setPasswordResetTokenValidity(new \DateTime('+1 hour'));
  64. $this->entityManager->persist($user);
  65. $this->entityManager->flush();
  66. if ($user->getId()) {
  67. $this->emailService->sendPasswordResetEmail($user->getId());
  68. }
  69. }
  70. return $this->redirectToRoute('app_forgot_password_request_success');
  71. }
  72. return $this->render('security/reset_password/request.html.twig', [
  73. 'form' => $form->createView(),
  74. ]);
  75. }
  76. /**
  77. * @Route("/anfrage/{token}", name="app_forgot_password_reset")
  78. */
  79. public function passwordReset(Request $request, string $token, UserPasswordHasherInterface $passwordHasher): Response {
  80. /** @var User */
  81. $user = $this->userRepository->findOneBy([
  82. 'passwordResetToken' => $token,
  83. ]);
  84. if (!$user instanceof User) {
  85. return $this->redirectToRoute('app_forgot_password_reset_failed');
  86. }
  87. $form = $this->createFormBuilder()
  88. ->add('password', PasswordType::class, [
  89. 'label' => 'Neues Passwort',
  90. ])
  91. ->add('user', HiddenType::class, [
  92. 'data' => $user->getId(),
  93. ])
  94. ->add('submit', SubmitType::class, [
  95. 'label' => 'Passwort zurücksetzen',
  96. 'attr' => [
  97. 'class' => 'btn btn-primary',
  98. ],
  99. ])
  100. ->getForm();
  101. $form->handleRequest($request);
  102. if ($form->isSubmitted() && $form->isValid()) {
  103. /** @var array<string> */
  104. $data = $form->getData();
  105. $user->setPassword(
  106. $passwordHasher->hashPassword(
  107. $user,
  108. $data['password']
  109. )
  110. );
  111. $user->setPasswordResetToken(null);
  112. $user->setPasswordResetTokenValidity(null);
  113. $this->entityManager->persist($user);
  114. $this->entityManager->flush();
  115. return $this->redirectToRoute('app_forgot_password_reset_success');
  116. }
  117. return $this->render('security/reset_password/reset.html.twig', [
  118. 'form' => $form->createView(),
  119. ]);
  120. }
  121. /**
  122. * @Route("/anfrage-versendet", name="app_forgot_password_request_success")
  123. */
  124. public function passwordResetRequestSuccess(): Response {
  125. return $this->render('security/reset_password/request_success.html.twig');
  126. }
  127. /**
  128. * @Route("/anfrage-fehlgeschlagen", name="app_forgot_password_failed")
  129. */
  130. public function passwordResetRequestFailed(): Response {
  131. return $this->render('security/reset_password/request_failed.html.twig');
  132. }
  133. /**
  134. * @Route("/zueucksetzen-erfolgreich", name="app_forgot_password_reset_success")
  135. */
  136. public function passwordResetSuccess(): Response {
  137. return $this->render('security/reset_password/reset_success.html.twig');
  138. }
  139. /**
  140. * @Route("/zueucksetzen-fehlgeschlagen", name="app_forgot_password_reset_failed")
  141. */
  142. public function passwordResetFailed(): Response {
  143. return $this->render('security/reset_password/reset_failed.html.twig');
  144. }
  145. }