src/Controller/Security/RegistrationController.php line 36

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 $entityManagerEmailService $emailService) {
  26.         $this->entityManager $entityManager;
  27.         $this->emailService $emailService;
  28.     }
  29.     #[Route('/registrierung'name'app_register')]
  30.     public function register(Request $requestUserPasswordHasherInterface $userPasswordHasherTenantService $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 $tokenUserRepository $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 $requestUserRepository $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. }