src/Controller/User/PasswordResetController.php line 28

Open in your IDE?
  1. <?php
  2. namespace App\Controller\User;
  3. use App\Entity\PasswordReset;
  4. use App\Entity\User;
  5. use App\Form\NewPasswordType;
  6. use App\Form\PasswordResetType;
  7. use App\Repository\PasswordResetRepository;
  8. use App\Repository\UserRepository;
  9. use App\Service\PasswordResetService;
  10. use Doctrine\ORM\Id\UuidGenerator;
  11. use SendGrid;
  12. use SendGrid\Mail\Mail;
  13. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  16. use Symfony\Component\Routing\Annotation\Route;
  17. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  18. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  19. class PasswordResetController extends AbstractController
  20. {
  21.     /**
  22.      * @Route("/login/password/reset", name="password_reset")
  23.      */
  24.     public function index(Request $requestUserRepository $userRepositoryPasswordResetService $passwordResetServiceSessionInterface $sessionInterface)
  25.     {
  26.         if($this->getUser() !== null){
  27.             return $this->redirectToRoute("app_login");
  28.         }
  29.         $form $this->createForm(PasswordResetType::class);
  30.         $form->handleRequest($request);
  31.         $error null;
  32.         if($form->isSubmitted()){
  33.             $email $form->get('email')->getData();
  34.             $user $userRepository->findOneBy(['email' => $email]);
  35.             $message $this->render('user/password_reset/_email.html.twig')->getContent();
  36.             
  37.             if($user instanceof User){
  38.                 
  39.                 $em $this->getDoctrine()->getManager();
  40.                 
  41.                 $passwordReset = new PasswordReset();
  42.                 
  43.                 $uuid = new UuidGenerator();
  44.                 $uuid $uuid->generate($em$passwordReset);
  45.                 
  46.                 $passwordReset->setEmail($email);
  47.                 $passwordReset->setToken($uuid);
  48.                 $em->persist($passwordReset);
  49.                 $em->flush();
  50.                 
  51.                 $link $passwordResetService->createLink($passwordReset->getToken());
  52.                 $message str_replace('%password_reset_link%'$link$message);
  53.                 $sendgrid_mail = new Mail();
  54.                 $sendgrid_mail->setFrom('noreply@smilemood.fr''Smile Mood'); 
  55.                 $sendgrid_mail->setSubject("Réinitialisation de mot de passe Smile Mood");
  56.                 $sendgrid_mail->addTo($email);
  57.                 $sendgrid_mail->addContent("text/html"$message);
  58.                 $sendgrid = new SendGrid($this->getParameter('sendgrid_api_key'));
  59.                 $response $sendgrid->send($sendgrid_mail);
  60.                 dd($response);
  61.                 $route $request->get('_route');
  62.                 $sessionInterface->set('password_reset_route'$route);
  63.                 $this->addFlash("success""Si l'adresse email est valide, vous recevrez un lien pour changer votre mot de passe.");
  64.                 return $this->redirectToRoute("password_reset_email_sent");
  65.             }else{
  66.                 $error "L'adresse email que vous avez saisi est introuvable.";
  67.             }
  68.         }
  69.         return $this->render('user/password_reset/index.html.twig', [
  70.             'form' => $form->createView(),
  71.             'error' => $error
  72.         ]);
  73.     }
  74.     /**
  75.      * Undocumented function
  76.      *
  77.      * @return void
  78.      * 
  79.      * @Route("/login/password/change", name="password_reset_change")
  80.      */
  81.     public function changePassword(Request $requestPasswordResetRepository $passwordResetRepositoryUserRepository $userRepositoryUserPasswordEncoderInterface $encoder){
  82.         $access $request->query->get('access');
  83.         $em $this->getDoctrine()->getManager();
  84.         $passwordReset $passwordResetRepository->findOneBy([
  85.             'token' => $access
  86.         ], [
  87.             'created_at' => 'DESC'
  88.         ]);
  89.         $error null;
  90.         if($passwordReset instanceof PasswordReset){
  91.             $email $passwordReset->getEmail();
  92.         }else{
  93.             $error "Ce code d'accès n'est plus valide.";
  94.         }
  95.         $form $this->createForm(NewPasswordType::class);
  96.         $form->handleRequest($request);
  97.         if($form->isSubmitted() && $form->isValid()){
  98.             $allPasswordReset $passwordResetRepository->findBy(['email' => $email]);
  99.             $newPassword $form->get('password')->getData();
  100.             $user $userRepository->findOneBy(['email' => $email]);
  101.             $user->setPassword($encoder->encodePassword($user$newPassword));
  102.             $em->persist($user);
  103.             foreach ($allPasswordReset as $reset) {
  104.                 $em->remove($reset);
  105.             }
  106.             $em->flush();
  107.             $this->addFlash("success""Votre mot de passe a été changé avec succès. Vous pouvez maintenant vous connecter avec votre nouveau mot de passe. ");
  108.             return $this->redirectToRoute("app_login");
  109.         }
  110.         
  111.         return $this->render("user/password_reset/new.password.html.twig", [
  112.             'form' => $form->createView(),
  113.             'error' => $error
  114.         ]);
  115.     }
  116.     /**
  117.      * @Route("/login/password/reset/sent", name="password_reset_email_sent")
  118.      */
  119.     public function passwordResetEmailSent(Request $requestSessionInterface $sessionInterface){
  120.         $previousRoute $sessionInterface->get('password_reset_route');
  121.         if(!empty($previousRoute)){
  122.             if($previousRoute !== "password_reset"){
  123.                 return $this->redirectToRoute("app_login");
  124.             }
  125.         }else{
  126.             return $this->redirectToRoute("app_login");
  127.         }
  128.         $sessionInterface->remove('password_reset_route');
  129.         return $this->render("user/password_reset/sent.html.twig");
  130.     }
  131. }