src/Controller/RegistrationController.php line 40

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Email\EmailManager;
  4. use App\Entity\Enum\RoleEnum;
  5. use App\Entity\RoleManagement;
  6. use App\Entity\User;
  7. use App\Form\ChangePasswordFormType;
  8. use App\Form\RegistrationFormType;
  9. use App\Repository\UserRepository;
  10. use App\Security\EmailVerifier;
  11. use App\Service\Utility\HashService;
  12. use App\SettingsProvider\GeneralSettingsList;
  13. use Doctrine\Persistence\ManagerRegistry;
  14. use Psr\Cache\InvalidArgumentException;
  15. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  16. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  17. use Symfony\Component\HttpFoundation\Request;
  18. use Symfony\Component\HttpFoundation\Response;
  19. use Symfony\Component\Mime\Address;
  20. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  21. use Symfony\Component\Routing\Annotation\Route;
  22. use Symfony\Component\Security\Core\Security;
  23. use Symfony\Contracts\Translation\TranslatorInterface;
  24. use SymfonyCasts\Bundle\VerifyEmail\Exception\VerifyEmailExceptionInterface;
  25. class RegistrationController extends AbstractController
  26. {
  27.     public function __construct(
  28.         private EmailVerifier $emailVerifier,
  29.         private TranslatorInterface $translator,
  30.         private ManagerRegistry $managerRegistry,
  31.         private EmailManager $emailManager,
  32.         private Security $security,
  33.         private GeneralSettingsList $getGeneralSettings
  34.     ) {}
  35.     #[Route('/register'name'app_register')]
  36.     public function register(Request $requestUserPasswordHasherInterface $userPasswordHasher): Response
  37.     {
  38.         try {
  39.             $isRegistration $this->getGeneralSettings->getIsRegistration();
  40.             if ($isRegistration === false) throw $this->createNotFoundException('404');
  41.         } catch (InvalidArgumentException $exception) {
  42.             $this->addFlash('danger'$this->translator->trans('errorPage.errorOccurred', [], 'security'));
  43.             $this->redirectToRoute('app_login');
  44.         }
  45.         if ($this->security->getUser()) return $this->redirectToRoute('admin_dashboard');
  46.         $userRole $this->managerRegistry->getRepository(RoleManagement::class)
  47.             ->findOneBy(['roleName' => RoleEnum::STANDARD_USER->value]);
  48.         $user = new User();
  49.         $form $this->createForm(RegistrationFormType::class, $user);
  50.         $form->handleRequest($request);
  51.         if ($form->isSubmitted() && $form->isValid()) {
  52.             // encode the plain password
  53.             $user->setPassword(
  54.             $userPasswordHasher->hashPassword(
  55.                     $user,
  56.                     $form->get('plainPassword')->getData()
  57.                 )
  58.             );
  59.             $user->addUserRole($userRole);
  60.             $em $this->managerRegistry->getManager();
  61.             $em->persist($user);
  62.             $em->flush();
  63.             // TODO email
  64.             $this->emailVerifier->sendEmailConfirmation('app_verify_email'$user,
  65.                 (new TemplatedEmail())
  66.                     ->from(new Address($this->emailManager->getFromEmail(), 'Korys'))
  67.                     ->to($user->getEmail())
  68.                     ->subject('Please Confirm your Email')
  69.                     ->htmlTemplate('security/registration/confirmation_email.html.twig')
  70.             );
  71.             $this->addFlash('success'$this->translator->trans('register.successfulMsg', [], 'security'));
  72.             return $this->redirectToRoute('app_login');
  73.         }
  74.         return $this->render('security/registration/register.html.twig', [
  75.             'registrationForm' => $form->createView(),
  76.         ]);
  77.     }
  78.     #[Route('/verify/email'name'app_verify_email')]
  79.     public function verifyUserEmail(Request $requestUserRepository $userRepository): Response
  80.     {
  81.         $id $request->get('id');
  82.         if (null === $id) {
  83.             return $this->redirectToRoute('app_login');
  84.         }
  85.         $user $userRepository->find($id);
  86.         if (null === $user) {
  87.             return $this->redirectToRoute('app_login');
  88.         }
  89.         // validate email confirmation link, sets User::isVerified=true and persists
  90.         try {
  91.             $this->emailVerifier->handleEmailConfirmation($request$user);
  92.         } catch (VerifyEmailExceptionInterface $exception) {
  93.             $this->addFlash('verify_email_error'$this->translator->trans($exception->getReason(), [], 'VerifyEmailBundle'));
  94.             return $this->redirectToRoute('app_login');
  95.         }
  96.         $this->addFlash('success'$this->translator->trans('register.emailHasBeenVerified', [], 'security'));
  97.         return $this->redirectToRoute('app_login');
  98.     }
  99.     #[Route('/verify/user'name'app_verify_user')]
  100.     public function verifyAdminUser(Request $requestUserRepository $userRepositoryUserPasswordHasherInterface $passwordHasher): Response
  101.     {
  102.         $id $request->get('id');
  103.         if (null === $id) {
  104.             return $this->redirectToRoute('app_login');
  105.         }
  106.         $user $userRepository->find($id);
  107.         if (null === $user) {
  108.             return $this->redirectToRoute('app_login');
  109.         }
  110.         $form $this->createForm(ChangePasswordFormType::class, $user);
  111.         $form->handleRequest($request);
  112.         if ($form->isSubmitted() && $form->isValid()) {
  113.             $plainPassword $form->get('plainPassword')->getData();
  114.             $encoded $passwordHasher->hashPassword($user$plainPassword);
  115.             $user->setIsVerified(true);
  116.             $user->setPassword($encoded);
  117.             $em $this->managerRegistry->getManager();
  118.             $em->persist($user);
  119.             $em->flush();
  120.             return $this->redirectToRoute('app_login');
  121.         }
  122.         return $this->render('security/reset_password/reset.html.twig', [
  123.             'form' => $form->createView(),
  124.         ]);
  125.     }
  126.     #[Route('/verify/new-email'name'app_verify_new_email')]
  127.     public function verifyNewUserEmail(Request $requestUserRepository $userRepositoryHashService $hashService): Response
  128.     {
  129.         $id $request->get('id');
  130.         if (!$id) return $this->redirectToRoute('app_login');
  131.         $decryptedId $hashService->hashString($id'decrypt');
  132.         $user $userRepository->find($decryptedId);
  133.         if (!$user) return $this->redirectToRoute('app_login');
  134.         try {
  135.             $user->setIsActive(true);
  136.             $em $this->managerRegistry->getManager();
  137.             $em->flush();
  138.         } catch (VerifyEmailExceptionInterface $exception) {
  139.             $this->addFlash('verify_email_error'$this->translator->trans($exception->getReason(), [], 'VerifyEmailBundle'));
  140.             return $this->redirectToRoute('app_login');
  141.         }
  142.         $this->addFlash('success'$this->translator->trans('register.emailHasBeenVerified', [], 'security'));
  143.         return $this->redirectToRoute('app_login');
  144.     }
  145. }