src/Infrastructure/Controller/Security/ResetPasswordController.php line 40

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Infrastructure\Controller\Security;
  4. use App\Domain\Common\Entity\BaseUser;
  5. use App\Domain\Common\Entity\UserAgent;
  6. use App\Domain\Common\Repository\BaseUserRepository;
  7. use App\Infrastructure\Controller\Common\BaseController;
  8. use App\Infrastructure\Form\Security\AskPasswordType;
  9. use App\Infrastructure\Form\Security\ResetPasswordType;
  10. use App\Infrastructure\Helper\TokenGeneratorHelper;
  11. use App\Infrastructure\Mailer\ResetPasswordMailer;
  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\Security\Core\User\PasswordAuthenticatedUserInterface;
  17. final class ResetPasswordController extends BaseController
  18. {
  19.     private BaseUserRepository $userRepository;
  20.     private UserPasswordHasherInterface $passwordHasher;
  21.     private ResetPasswordMailer $resetPasswordMailer;
  22.     public function __construct(
  23.         BaseUserRepository $userRepository,
  24.         UserPasswordHasherInterface $passwordHasher,
  25.         ResetPasswordMailer $resetPasswordMailer
  26.     ) {
  27.         $this->userRepository $userRepository;
  28.         $this->passwordHasher $passwordHasher;
  29.         $this->resetPasswordMailer $resetPasswordMailer;
  30.     }
  31.     /**
  32.      * @Route("/reinitialiser-mot-de-passe", name="app_security_reset_password_action")
  33.      */
  34.     public function resetPasswordAction(Request $request): Response
  35.     {
  36.         $user $this->getUser();
  37.         if ($user) {
  38.             return $this->redirectToRoute('app_homepage');
  39.         }
  40.         $token $request->query->get('token');
  41.         if (null === $token) {
  42.             $askPasswordForm $this->createForm(AskPasswordType::class);
  43.             $askPasswordForm->handleRequest($request);
  44.             if ($askPasswordForm->isSubmitted() && $askPasswordForm->isValid()) {
  45.                 $user $this->userRepository->find($askPasswordForm->get('codeClient')->getData());
  46.                 if (null !== $user) {
  47.                     $user->setResetPasswordToken(TokenGeneratorHelper::generateToken());
  48.                     $this->userRepository->save($user);
  49.                     if ($resetPasswordToken $user->getResetPasswordToken()) {
  50.                         $this->resetPasswordMailer->sendResetPasswordEmail($user$resetPasswordToken);
  51.                     }
  52.                 }
  53.                 return $this->render('Security/reset_password/validate.html.twig');
  54.             }
  55.             return $this->render('Security/reset_password/request.html.twig', [
  56.                 'form' => $askPasswordForm->createView(),
  57.             ]);
  58.         }
  59.         $user $this->userRepository->findOneBy([
  60.             'resetPasswordToken' => $token,
  61.         ]);
  62.         if (null === $user) {
  63.             return $this->redirectToRoute('app_security_reset_password_action');
  64.         }
  65.         $resetPasswordForm $this->createForm(ResetPasswordType::class);
  66.         $resetPasswordForm->handleRequest($request);
  67.         if ($resetPasswordForm->isSubmitted() && $resetPasswordForm->isValid()) {
  68.             /** @var PasswordAuthenticatedUserInterface&BaseUser $user */
  69.             $user->setPassword($this->passwordHasher->hashPassword($user$resetPasswordForm->get('plainPassword')->getData()));
  70.             $user->setResetPasswordToken(null);
  71.             $this->userRepository->save($user);
  72.             $this->addFlash(self::FLASH_SUCCESS'Votre mot de passe a été réinitialisé avec succès.');
  73.             return $this->redirectToRoute('app_security_login', [
  74.                 'username' => $user->getCodeClient(),
  75.             ]);
  76.         }
  77.         return $this->render('Security/reset_password/action.html.twig', [
  78.             'form' => $resetPasswordForm->createView(),
  79.             'mainTitleLabel' => $user instanceof UserAgent 'Créez votre mot de passe' 'Mot de passe oublié ?',
  80.         ]);
  81.     }
  82. }