src/Controller/RegistrationController.php line 40

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Applicants;
  4. use App\Features\Core\IRoleManager;
  5. use App\Form\RegistrationFormType;
  6. use App\Repository\ApplicantsRepository;
  7. use App\Security\EmailVerifier;
  8. use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  11. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\HttpFoundation\Response;
  14. use Symfony\Component\Mime\Address;
  15. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  16. use Symfony\Component\Routing\Annotation\Route;
  17. use Symfony\Contracts\Translation\TranslatorInterface;
  18. use SymfonyCasts\Bundle\VerifyEmail\Exception\VerifyEmailExceptionInterface;
  19. class RegistrationController extends AbstractController
  20. {
  21.     private EmailVerifier $emailVerifier;
  22.     public function __construct(EmailVerifier $emailVerifier, private IRoleManager $roleManager, private string $mailFrom)
  23.     {
  24.         $this->emailVerifier $emailVerifier;
  25.     }
  26.     #[Route('/inscription'name'applicant_register')]
  27.     public function register(Request $requestUserPasswordHasherInterface $userPasswordHasher,
  28.                              EntityManagerInterface $entityManagerTranslatorInterface $translator): Response
  29.     {
  30.         if($this->roleManager->isApplicant()) {
  31.             return $this->redirectToRoute('applicant-profile');
  32.         }
  33.         $user = new Applicants();
  34.         $form $this->createForm(RegistrationFormType::class, $user);
  35.         $form->handleRequest($request);
  36.         if ($form->isSubmitted() && $form->isValid()) {
  37.             if($form->get(RegistrationFormType::PASSWORD)->getData()
  38.                 !==$form->get(RegistrationFormType::CONFIRMED_PASSWORD)->getData()){
  39.                 $this->addFlash("error"$translator->trans("repeat_password.differ"));
  40.             }else{
  41.                 $user->setHashPassword($userPasswordHasher->hashPassword($user$form->get(RegistrationFormType::PASSWORD)->getData()));
  42.                 try{
  43.                     $entityManager->persist($user);
  44.                     $entityManager->flush();
  45.                     // generate a signed url and email it to the user
  46.                     $this->sendEmailConfirmation($user);
  47.                     $this->addFlash('notice'$translator->trans("registration.confirmation_email_send"));
  48.                     return $this->redirectToRoute('applicant_register_confirm_email');
  49.                 }catch (\Exception $e){
  50.                     if($e instanceof UniqueConstraintViolationException){
  51.                         $this->addFlash("error"$translator->trans("registration.user_already_exist", ['{{ email }}'=>$user->getEmail()]));
  52.                     }else{
  53.                         $this->addFlash("error"$translator->trans("something went wrong"));
  54.                     }
  55.                 }
  56.             }
  57.         }
  58.         return $this->render('registration/register.html.twig', [
  59.             'form' => $form->createView(),
  60.             'title'=>"Inscription"
  61.         ]);
  62.     }
  63.     #[Route('/confirmer-mon-email'name'applicant_register_confirm_email')]
  64.     public function registrationSuccess(Request $request): Response
  65.     {
  66.         $email$request->get("email");
  67.         return $this->render($email 'registration/confirm_account.html.twig' 'registration/registration_success.html.twig', [
  68.             "email" => $email,
  69.             "title"=>"Confirmation de l'email"
  70.         ]);
  71.     }
  72.     #[Route('/renvoyer-mail-confirmation/{email}/'name'applicant_resend_confirmation_mail')]
  73.     public function resentEmail(Applicants $applicant): Response
  74.     {
  75.         $this->sendEmailConfirmation($applicant);
  76.         $this->addFlash('notice''Un email de confirmation vous a été envoyé');
  77.         return $this->redirectToRoute("applicant_register_confirm_email");
  78.     }
  79.     #[Route('/verifier-mon-email'name'applicant_verify_email')]
  80.     public function verifyUserEmail(Request $requestTranslatorInterface $translatorApplicantsRepository $applicantsRepository): Response
  81.     {
  82.         $id $request->get('id');
  83.         if (null === $id) {
  84.             return $this->redirectToRoute('applicant_register');
  85.         }
  86.         $user $applicantsRepository->find($id);
  87.         if (null === $user) {
  88.             return $this->redirectToRoute('applicant_register');
  89.         }
  90.         try {
  91.             $this->emailVerifier->handleEmailConfirmation($request$user);
  92.         } catch (VerifyEmailExceptionInterface $exception) {
  93.             $this->addFlash('notice'$translator->trans($exception->getReason(), [], 'VerifyEmailBundle'));
  94.             return $this->redirectToRoute('applicant_register');
  95.         }
  96.         $this->addFlash('notice'"Compte confirmé avec succès. Vous pouvez à présent vous connecter");
  97.         return $this->redirectToRoute('applicant-profile');
  98.     }
  99.     /**
  100.      * @param Applicants $applicant
  101.      * @return void
  102.      */
  103.     public function sendEmailConfirmation(Applicants $applicant): void
  104.     {
  105.         $this->emailVerifier->sendEmailConfirmation('applicant_verify_email'$applicant,
  106.             (new TemplatedEmail())
  107.                 ->from(new Address($this->mailFrom'NSIA BANQUE Bénin'))
  108.                 ->to($applicant->getEmail())
  109.                 ->subject('Confirmer votre adresse email')
  110.                 ->htmlTemplate('registration/confirmation_email.html.twig')
  111.         );
  112.     }
  113. }