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 $entityManagerUserRepository $userRepositoryEmailService $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 $requeststring $tokenUserPasswordHasherInterface $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. }