src/Controller/UserController.php line 165

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\User;
  4. use App\Form\RecoverPasswordFormType;
  5. use App\Form\RegistrationFormType;
  6. use App\Form\ResetPasswordFormType;
  7. use App\Form\UpdateDetailsFormType;
  8. use App\Service\EmailSender;
  9. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  10. use Symfony\Component\HttpFoundation\Request;
  11. use Symfony\Component\HttpFoundation\Response;
  12. use Symfony\Component\Routing\Annotation\Route;
  13. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  14. class UserController extends AbstractController
  15. {
  16. const MESSAGE_ACCOUNT_CREATED = "Before you can login, you must activate your account.\nPlease check your email and use the link provided to complete your registration.";
  17. const MESSAGE_ACCOUNT_ACTIVATED = "Your account has now been activated.";
  18. const MESSAGE_INVALID_TOKEN = "Your verification token was invalid.\n\nPlease retry using the link in your email.";
  19. const MESSAGE_INVALID_EMAIL = "No user found with that email address.";
  20. const MESSAGE_PASSWORD_RESET = "Please check your email and use the link provided to reset your password.";
  21. /**
  22. * @Route("/register/{token}", name="app_register")
  23. * @param Request $request
  24. * @param UserPasswordEncoderInterface $passwordEncoder
  25. * @param EmailSender $sender
  26. * @param string $token
  27. * @return Response
  28. */
  29. public function register(Request $request, UserPasswordEncoderInterface $passwordEncoder, EmailSender $sender, string $token = null): Response
  30. {
  31. if ($token === null) {
  32. $user = new User();
  33. } else {
  34. $user = $this->getDoctrine()
  35. ->getRepository(User::class)
  36. ->findOneByToken($token);
  37. $user->setPassword('');
  38. }
  39. $form = $this->createForm(RegistrationFormType::class, $user);
  40. $form->handleRequest($request);
  41. if ($form->isSubmitted() && $form->isValid()) {
  42. $user->setPassword($passwordEncoder->encodePassword($user, $form->get('plainPassword')->getData()));
  43. $entityManager = $this->getDoctrine()->getManager();
  44. $entityManager->persist($user);
  45. $entityManager->flush();
  46. $sender->sendVerificationEmail($user);
  47. $this->addFlash('notice', self::MESSAGE_ACCOUNT_CREATED);
  48. return $this->render('security/post-register.html.twig', []);
  49. }
  50. return $this->render('security/register.html.twig', [
  51. 'form' => $form->createView(),
  52. ]);
  53. }
  54. /**
  55. * @Route("/verify/{token}", name="app_verify")
  56. * @param string $token
  57. * @return Response
  58. */
  59. public function verify(string $token = null): Response
  60. {
  61. $user = $this->getDoctrine()->getRepository(User::class)->findOneByToken($token);
  62. if ($user) {
  63. $user->setVerified(true);
  64. $user->setVerificationToken(null);
  65. $this->getDoctrine()->getManager()->flush();
  66. $this->addFlash('notice', self::MESSAGE_ACCOUNT_ACTIVATED);
  67. } else {
  68. $this->addFlash('error', self::MESSAGE_INVALID_TOKEN);
  69. }
  70. return $this->redirectToRoute('app_login');
  71. }
  72. /**
  73. * @Route("/update-details", name="app_update_user")
  74. * @param Request $request
  75. * @param UserPasswordEncoderInterface $passwordEncoder
  76. * @return Response
  77. */
  78. public function update(Request $request, UserPasswordEncoderInterface $passwordEncoder): Response
  79. {
  80. $user = $this->getUser();
  81. $form = $this->createForm(UpdateDetailsFormType::class, $user);
  82. $form->handleRequest($request);
  83. if ($form->isSubmitted() && $form->isValid()) {
  84. $user->setPassword($passwordEncoder->encodePassword($user, $form->get('plainPassword')->getData()));
  85. $entityManager = $this->getDoctrine()->getManager();
  86. $entityManager->persist($user);
  87. $entityManager->flush();
  88. return $this->redirectToRoute('dashboard');
  89. }
  90. return $this->render('security/register.html.twig', [
  91. 'form' => $form->createView(),
  92. 'update' => true,
  93. ]);
  94. }
  95. /**
  96. * @Route("/recover-password", name="app_recover_password")
  97. * @param Request $request
  98. * @param EmailSender $sender
  99. * @return Response
  100. */
  101. public function recoverPassword(Request $request, EmailSender $sender): Response
  102. {
  103. $form = $this->createForm(RecoverPasswordFormType::class);
  104. $form->handleRequest($request);
  105. if ($form->isSubmitted() && $form->isValid()) {
  106. $user = $this->getDoctrine()
  107. ->getRepository(User::class)
  108. ->findOneBy([
  109. 'email' => $form->getData()['email'],
  110. ]);
  111. if ($user) {
  112. $user->setVerificationToken(uniqid());
  113. $entityManager = $this->getDoctrine()->getManager();
  114. $entityManager->persist($user);
  115. $entityManager->flush();
  116. $sender->sendPasswordResetEmail($user);
  117. $this->addFlash('notice', self::MESSAGE_PASSWORD_RESET);
  118. return $this->redirectToRoute('app_login');
  119. } else {
  120. $this->addFlash('error', self::MESSAGE_INVALID_EMAIL);
  121. }
  122. }
  123. return $this->render('security/recover-password.html.twig', [
  124. 'recoveryForm' => $form->createView(),
  125. 'user' => $user ?? null,
  126. ]);
  127. }
  128. /**
  129. * @Route("/reset-password/{token}", name="app_reset_password")
  130. * @param Request $request
  131. * @param string $token
  132. * @param UserPasswordEncoderInterface $passwordEncoder
  133. * @return Response
  134. */
  135. public function resetPassword(Request $request, UserPasswordEncoderInterface $passwordEncoder, string $token = null): Response
  136. {
  137. $form = $this->createForm(ResetPasswordFormType::class);
  138. $form->handleRequest($request);
  139. $user = $this->getDoctrine()->getRepository(User::class)->findOneByToken($token);
  140. if ($user !== null && $form->isSubmitted() && $form->isValid()) {
  141. $user
  142. ->setPassword($passwordEncoder->encodePassword($user, $form->get('plainPassword')->getData()))
  143. ->setVerificationToken(null);
  144. $entityManager = $this->getDoctrine()->getManager();
  145. $entityManager->persist($user);
  146. $entityManager->flush();
  147. return $this->redirectToRoute('app_login');
  148. }
  149. return $this->render('security/reset-password.html.twig', [
  150. 'resetForm' => $form->createView(),
  151. ]);
  152. }
  153. }