src/Controller/Security/RegistrationController.php line 67

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Security;
  3. use App\Entity\User;
  4. use App\Form\RegistrationType;
  5. use App\Repository\UserRepository;
  6. use App\Service\EmailService;
  7. use App\Service\TenantService;
  8. use Doctrine\ORM\EntityManagerInterface;
  9. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  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. #[Route('/kundenkonto')]
  18. class RegistrationController extends AbstractController {
  19. /** @var EntityManagerInterface */
  20. private EntityManagerInterface $entityManager;
  21. /**
  22. * @var EmailService
  23. */
  24. private $emailService;
  25. public function __construct(EntityManagerInterface $entityManager, EmailService $emailService) {
  26. $this->entityManager = $entityManager;
  27. $this->emailService = $emailService;
  28. }
  29. #[Route('/registrierung', name: 'app_register')]
  30. public function register(Request $request, UserPasswordHasherInterface $userPasswordHasher, TenantService $tenantService): Response {
  31. $user = new User();
  32. $form = $this->createForm(RegistrationType::class, $user);
  33. $form->handleRequest($request);
  34. if ($form->isSubmitted() && $form->isValid()) {
  35. $user->setPassword(
  36. $userPasswordHasher->hashPassword(
  37. $user,
  38. $form->get('plainPassword')->getData()
  39. )
  40. );
  41. if ($user instanceof User) {
  42. $user->setUsername($user->getEmail());
  43. $user->setVerifyEmailToken(Uuid::v6());
  44. $user->setVerifyEmailTokenValidity(new \DateTime('+1 hour'));
  45. $user->setTenant($tenantService->getTenant());
  46. $user->setDateCreated(new \DateTime());
  47. $this->entityManager->persist($user);
  48. $this->entityManager->flush();
  49. if ($user->getId()) {
  50. $this->emailService->sendDoubleOptInEmail($user->getId());
  51. }
  52. }
  53. return $this->redirectToRoute('app_verify_registration');
  54. }
  55. return $this->render('security/registration/register.html.twig', [
  56. 'registrationForm' => $form->createView(),
  57. ]);
  58. }
  59. #[Route('/verifizierung/email/{token}', name: 'app_verify_email')]
  60. public function verifyUserEmail(string $token, UserRepository $userRepository): Response {
  61. /** @var User */
  62. $user = $userRepository->findOneBy([
  63. 'verifyEmailToken' => $token,
  64. ]);
  65. if (!$user instanceof User) {
  66. return $this->redirectToRoute('app_register');
  67. }
  68. if (new \DateTime('now') > $user->getVerifyEmailTokenValidity()) {
  69. return $this->redirectToRoute('app_verification_link_expired');
  70. }
  71. $user->setIsVerified(true);
  72. $user->setVerifyEmailToken(null);
  73. $user->setVerifyEmailTokenValidity(null);
  74. $this->entityManager->persist($user);
  75. $this->entityManager->flush();
  76. return $this->redirectToRoute('storefront_login');
  77. }
  78. #[Route('/registrierung/verifizieren', name: 'app_verify_registration')]
  79. public function requestEmailVerification(): Response {
  80. return $this->render('security/registration/verify.html.twig');
  81. }
  82. #[Route('/registrierung/erfolgreich', name: 'app_register_success')]
  83. public function registrationSuccessful(): Response {
  84. return $this->render('security/registration/success.html.twig');
  85. }
  86. #[Route('/verifizierung/link-abgelaufen', name: 'app_verification_link_expired')]
  87. public function verificationLinkExpired(Request $request, UserRepository $userRepository): Response {
  88. $form = $this->createFormBuilder()
  89. ->add('email', TextType::class, [
  90. 'label' => 'E-Mail Adresse',
  91. 'attr' => [
  92. 'class' => 'border-accent form-control',
  93. 'placeholder' => 'Deine E-Mail Adresse',
  94. ],
  95. ])
  96. ->add('submit', SubmitType::class, [
  97. 'label' => 'Neuen Verifizierungslink anfragen',
  98. 'attr' => [
  99. 'class' => 'button accent',
  100. ],
  101. ])
  102. ->getForm();
  103. $form->handleRequest($request);
  104. if ($form->isSubmitted() && $form->isValid()) {
  105. /** @var array<string> */
  106. $data = $form->getData();
  107. /** @var User */
  108. $user = $userRepository->findOneBy([
  109. 'email' => $data['email'],
  110. ]);
  111. if ($user instanceof User) {
  112. if ($user->isVerified()) {
  113. return $this->redirectToRoute('storefront_login');
  114. }
  115. $user->setVerifyEmailToken(Uuid::v6());
  116. $user->setVerifyEmailTokenValidity(new \DateTime('+1 hour'));
  117. $this->entityManager->persist($user);
  118. $this->entityManager->flush();
  119. if ($user->getId()) {
  120. $this->emailService->sendDoubleOptInEmail($user->getId());
  121. }
  122. return $this->redirectToRoute('app_verify_registration');
  123. }
  124. }
  125. return $this->render('security/registration/expired.html.twig', [
  126. 'form' => $form->createView(),
  127. ]);
  128. }
  129. }