src/Controller/RegistrationController.php line 146

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\User;
  4. use App\Enums\MailerLiteGroupEnum;
  5. use App\Event\FilterUserResponseEvent;
  6. use App\Event\FormEvent;
  7. use App\Event\FOSUserEvents;
  8. use App\Event\GetResponseUserEvent;
  9. use App\Form\RegistrationFormType;
  10. use App\Repository\UserRepository;
  11. use App\Security\EmailVerifier;
  12. use App\Services\SendGrid\SendRegistrationLinkSendGridService;
  13. use App\Services\UserService;
  14. use Doctrine\ORM\EntityManagerInterface;
  15. use Psr\Log\LoggerInterface;
  16. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  17. use Symfony\Component\HttpFoundation\RedirectResponse;
  18. use Symfony\Component\HttpFoundation\Request;
  19. use Symfony\Component\HttpFoundation\Response;
  20. use Symfony\Component\Routing\Annotation\Route;
  21. use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
  22. use Symfony\Contracts\Translation\TranslatorInterface;
  23. use SymfonyCasts\Bundle\VerifyEmail\Exception\VerifyEmailExceptionInterface;
  24. use SymfonyCasts\Bundle\VerifyEmail\VerifyEmailHelperInterface;
  25. use Throwable;
  26. class RegistrationController extends AbstractController
  27. {
  28.     private EmailVerifier $emailVerifier;
  29.     private EntityManagerInterface $objectManager;
  30.     private EventDispatcherInterface $eventDispatcher;
  31.     private LoggerInterface $logger;
  32.     private UserService $userService;
  33.     private TranslatorInterface $translator;
  34.     private UserRepository $userRepository;
  35.     private SendRegistrationLinkSendGridService $sendRegistrationLinkSendGridService;
  36.     private VerifyEmailHelperInterface $verifyEmailHelper;
  37.     /**
  38.      * @param EmailVerifier $emailVerifier
  39.      * @param EntityManagerInterface $objectManager
  40.      * @param EventDispatcherInterface $eventDispatcher
  41.      * @param LoggerInterface $logger
  42.      * @param UserService $userService
  43.      * @param TranslatorInterface $translator
  44.      * @param UserRepository $userRepository
  45.      * @param SendRegistrationLinkSendGridService $sendRegistrationLinkSendGridService
  46.      * @param VerifyEmailHelperInterface $verifyEmailHelper
  47.      */
  48.     public function __construct(
  49.         EmailVerifier $emailVerifier,
  50.         EntityManagerInterface $objectManager,
  51.         EventDispatcherInterface $eventDispatcher,
  52.         LoggerInterface $logger,
  53.         UserService $userService,
  54.         TranslatorInterface $translator,
  55.         UserRepository $userRepository,
  56.         SendRegistrationLinkSendGridService $sendRegistrationLinkSendGridService,
  57.         VerifyEmailHelperInterface $verifyEmailHelper
  58.     ) {
  59.         $this->emailVerifier $emailVerifier;
  60.         $this->objectManager $objectManager;
  61.         $this->eventDispatcher $eventDispatcher;
  62.         $this->logger $logger;
  63.         $this->userService $userService;
  64.         $this->translator $translator;
  65.         $this->userRepository $userRepository;
  66.         $this->sendRegistrationLinkSendGridService $sendRegistrationLinkSendGridService;
  67.         $this->verifyEmailHelper $verifyEmailHelper;
  68.     }
  69.     /**
  70.      * @param Request $request
  71.      * @return Response
  72.      * @throws Throwable
  73.      */
  74.     #[Route('/register'name'register')]
  75.     public function register(Request $request): Response
  76.     {
  77.         $user = new User();
  78.         $user->setEnabled(true);
  79.         $event = new GetResponseUserEvent($user$request);
  80.         $this->eventDispatcher->dispatch($eventFOSUserEvents::REGISTRATION_INITIALIZE);
  81.         if (null !== $event->getResponse()) {
  82.             return $event->getResponse();
  83.         }
  84.         $form $this->createForm(RegistrationFormType::class, $user);
  85.         $form->handleRequest($request);
  86.         if ($form->isSubmitted()) {
  87.             $event = new FormEvent($form$request);
  88.             if ($form->isValid()) {
  89.                 $this->eventDispatcher->dispatch($eventFOSUserEvents::REGISTRATION_SUCCESS);
  90.                 $user->setEnabled(false);
  91.                 $this->userService->updateUser($user$form);
  92.                 $this->objectManager->persist($user);
  93.                 $this->objectManager->flush();
  94.                 $this->userService->subscribeUser($userMailerLiteGroupEnum::getRegistrationGroup());
  95.                 $this->logger->info(sprintf("New user registration: %s"$user));
  96.                 $signatureComponents $this->verifyEmailHelper->generateSignature(
  97.                     'app_verify_email',
  98.                     (string)$user->getId(),
  99.                     $user->getEmail(),
  100.                     ['id' => $user->getId()]
  101.                 );
  102.                 $params = [
  103.                     'link' => $signatureComponents->getSignedUrl()
  104.                 ];
  105.                 $this->sendRegistrationLinkSendGridService->sendMail($user->getEmail(), $params);
  106.                 if (null === $response $event->getResponse()) {
  107.                     $url $this->generateUrl('login');
  108.                     $response = new RedirectResponse($url);
  109.                 }
  110.                 $this->eventDispatcher->dispatch(
  111.                     new FilterUserResponseEvent($user$request$response),
  112.                     FOSUserEvents::REGISTRATION_COMPLETED
  113.                 );
  114.                 return $response;
  115.             }
  116.             $this->eventDispatcher->dispatch($eventFOSUserEvents::REGISTRATION_FAILURE);
  117.             if (null !== $response $event->getResponse()) {
  118.                 return $response;
  119.             }
  120.         }
  121.         return $this->render('registration/register.html.twig', [
  122.             'form' => $form->createView(),
  123.         ]);
  124.     }
  125.     /**
  126.      * @param Request $request
  127.      * @return Response
  128.      */
  129.     #[Route('/verify/email'name'app_verify_email')]
  130.     public function verifyUserEmail(Request $request): Response
  131.     {
  132.         $id $request->get('id'); // retrieve the user id from the url
  133.         // Verify the user id exists and is not null
  134.         if (null === $id) {
  135.             return $this->redirectToRoute('login');
  136.         }
  137.         $user $this->userRepository->find($id);
  138.         // Ensure the user exists in persistence
  139.         if (null === $user) {
  140.             return $this->redirectToRoute('login');
  141.         }
  142.         // validate email confirmation link, sets User::isVerified=true and persists
  143.         try {
  144.             $this->emailVerifier->handleEmailConfirmation($request$user);
  145.         } catch (VerifyEmailExceptionInterface $exception) {
  146.             $this->addFlash(
  147.                 'verify_email_error',
  148.                 $this->translator->trans($exception->getReason(), [], 'VerifyEmailBundle')
  149.             );
  150.             return $this->redirectToRoute('register');
  151.         }
  152.         // @TODO Change the redirect on success and handle or remove the flash message in your templates
  153.         $this->addFlash('success''Vaša e-mail adresa je verifikovana.');
  154.         return $this->redirectToRoute('login');
  155.     }
  156. }