src/App/Controller/ForgotPassword/RequestPasswordLinkController.php line 36

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace App\Controller\ForgotPassword;
  3. use App\Email\ResetPassword;
  4. use App\Entity\PasswordReset;
  5. use App\Entity\User;
  6. use App\Form\Type\RequestPasswordResetType;
  7. use App\Security\RandomGenerator;
  8. use DateTime;
  9. use Doctrine\Persistence\ManagerRegistry;
  10. use Sindrive\EmailSenderBundle\Service\EmailSender;
  11. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\HttpFoundation\Response;
  14. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  15. class RequestPasswordLinkController extends AbstractController
  16. {
  17.     private ManagerRegistry $doctrine;
  18.     private RandomGenerator $randomGenerator;
  19.     private EmailSender $emailSender;
  20.     private int $resetPasswordTTL;
  21.     public function __construct(ManagerRegistry $doctrineRandomGenerator $randomGeneratorEmailSender $emailSender)
  22.     {
  23.         $this->doctrine $doctrine;
  24.         $this->randomGenerator $randomGenerator;
  25.         $this->emailSender $emailSender;
  26.     }
  27.     public function sendPasswordRequest(Request $request): Response
  28.     {
  29.         $hideForm false;
  30.         $form $this->createForm(RequestPasswordResetType::class)->handleRequest($request);
  31.         if ($form->isSubmitted() && $form->isValid()) {
  32.             $userRepository $this->doctrine->getRepository(User::class);
  33.             $user $userRepository->findOneBy(['email' => $form->get('email')->getData()]);
  34.             if (null !== $user) {
  35.                 $dateGone DateTime::createFromFormat('U', (string) (time() + $this->resetPasswordTTL));
  36.                 if (false === $dateGone) {
  37.                     $dateGone = new DateTime('+4 hours');
  38.                 }
  39.                 $passwordReset = new PasswordReset(
  40.                     $user,
  41.                     $this->randomGenerator->generateToken(22),
  42.                     $dateGone
  43.                 );
  44.                 $link $this->generateUrl(
  45.                     'reset_password_new',
  46.                     ['hash' => $passwordReset->getCode()],
  47.                     UrlGeneratorInterface::ABSOLUTE_URL
  48.                 );
  49.                 $this->doctrine->getManager()->persist($passwordReset);
  50.                 $this->doctrine->getManager()->flush();
  51.                 $this->emailSender->sendType(new ResetPassword($user$link));
  52.             }
  53.             return $this->render('forgot_password/request_complete.html.twig');
  54.         }
  55.         return $this->render('forgot_password/request.html.twig', ['form' => $form->createView(), 'hideForm' => $hideForm]);
  56.     }
  57.     /**
  58.      * @required
  59.      */
  60.     public function setResetPasswordTTL(int $resetPasswordTTL): void
  61.     {
  62.         $this->resetPasswordTTL $resetPasswordTTL;
  63.     }
  64. }