src/Controller/RegistrationController.php line 52

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Email\DefaultTemplatedEmail;
  4. use App\Form\LoginRegistrationFormType;
  5. use App\Repository\PartnerPendingRepository;
  6. use App\Repository\UserRepository;
  7. use Symfony\Component\Mime\Address;
  8. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  9. use App\Entity\User;
  10. use App\Entity\PartnerPending;
  11. use App\Form\RegistrationFormType;
  12. use App\Security\EmailVerifier;
  13. use App\Service\Sms;
  14. use Doctrine\ORM\EntityManagerInterface;
  15. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  16. use Symfony\Component\HttpFoundation\Request;
  17. use Symfony\Component\HttpFoundation\Response;
  18. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  19. use Symfony\Component\Routing\Annotation\Route;
  20. use SymfonyCasts\Bundle\VerifyEmail\Exception\VerifyEmailExceptionInterface;
  21. class RegistrationController extends AbstractController
  22. {
  23.     private EmailVerifier $emailVerifier;
  24.     public function __construct(EmailVerifier $emailVerifier)
  25.     {
  26.         $this->emailVerifier $emailVerifier;
  27.     }
  28.     /**
  29.      * @Route("/self-validation", name="self_validating_authentication")
  30.      * @param Request $request
  31.      *
  32.      * @return Response
  33.      */
  34.     public function selfValidation(Request $request): Response
  35.     {
  36.         return $this->json(true);
  37.     }
  38.     /**
  39.      * @Route("/login_register/{partnerToken?}", name="login_register")
  40.      * @param Request                     $request
  41.      * @param null                        $partnerToken
  42.      *
  43.      * @return Response
  44.      */
  45.     public function login_register(TokenStorageInterface $tokenStorageUserRepository $repoUserRequest $request,  $partnerToken null): Response
  46.     {
  47.         $session                    $request->getSession();
  48.         $isComplaint                $request->get("complaint""0") == "1";
  49.         if ($isComplaint && !$session->get("expressComplaintPrice")) {
  50.             return $this->redirectToRoute("express_complaint_x_prices");
  51.         }
  52.         if ($this->getUser()) {
  53.             if ($partnerToken) {
  54.                 $session->invalidate();
  55.                 $tokenStorage->setToken();
  56.             } else {
  57.                 if ($isComplaint) {
  58.                     return $this->redirectToRoute('express_complaint_x_identity');
  59.                 } else {
  60.                     return $this->redirectToRoute('user_home');
  61.                 }
  62.             }
  63.         }
  64.         $session->remove("login_register_email");
  65.         $form                       $this->createForm(LoginRegistrationFormType::class);
  66.         $form->handleRequest($request);
  67.         if ($isComplaint) {
  68.             $loginRoute             "login";
  69.             $registerRoute          "express_complaint_register";
  70.             $template               "ExpressComplaint/login_register.html.twig";
  71.             $viewParameters         = [
  72.                 'breadcrumbComplaintExpress'    => 'inscription',
  73.                 'navbarTitle'                   => $session->get('expressComplaintCategoryName'),
  74.                 'progressValue'                 => 5,
  75.             ];
  76.             $routeParameters        = [
  77.                 "complaint"         => "1"
  78.             ];
  79.         } else {
  80.             $loginRoute             "login";
  81.             $registerRoute          "register";
  82.             $template               "Registration/login_register.html.twig";
  83.             $viewParameters         = [];
  84.             $routeParameters        = [];
  85.         }
  86.         if ($form->isSubmitted() && $form->isValid()) {
  87.             $datas                  $form->getData();
  88.             $email                  $datas["email"];
  89.             $session->set('login_register_email'$email);
  90.             $user                   $repoUser->findByEmail($email);
  91.             if ($user) {
  92.                 return $this->redirectToRoute($loginRoute$routeParameters);
  93.             }
  94.             return $this->redirectToRoute($registerRoute, ['partnerToken' => $partnerToken]);
  95.         }
  96.         return $this->render($templatearray_merge(
  97.             [
  98.                 'form' => $form->createView()
  99.             ],
  100.             $viewParameters
  101.         ));
  102.         // gets an attribute by name
  103.         //        $foo = $session->get('foo');
  104.     }
  105.     /**
  106.      * @Route("/register/{partnerToken?}", name="register")
  107.      * @param Request                     $request
  108.      * @param UserPasswordHasherInterface $passwordHasher
  109.      * @param Sms                         $sms
  110.      * @param null                        $partnerToken
  111.      * @param TokenStorageInterface|null  $tokenStorage
  112.      *
  113.      * @return Response
  114.      */
  115.     public function register(
  116.         Request $request,
  117.         UserRepository $repoUser,
  118.         PartnerPendingRepository $repoPartnerPending,
  119.         UserPasswordHasherInterface $passwordHasher,
  120.         Sms $sms,
  121.         $partnerToken null,
  122.         TokenStorageInterface $tokenStorage null
  123.     ): Response {
  124.         $session                    $request->getSession();
  125.         // Redirect the user if they're already logged in
  126.         if ($this->getUser()) {
  127.             // If a user is logged in and we click on a link to create a new account
  128.             // (e.g.: the partner received an email but is opening the link from the same computer where a session for the other partner already exists)
  129.             // Then destroy the session to allow accessing the Registration Form
  130.             if (null !== $partnerToken) {
  131.                 $session->invalidate();
  132.                 $tokenStorage->setToken();
  133.             } else { // Otherwise, just redirect to user_home as a logged user shouldn't access the registration form
  134.                 return $this->redirectToRoute('user_home');
  135.             }
  136.         }
  137.         $email              $session->get("login_register_email");
  138.         if (!$email) {
  139.             return $this->redirectToRoute('login_register');
  140.         }
  141.         if ($repoUser->findByEmail($email)) {
  142.             return $this->redirectToRoute('login');
  143.         }
  144.         // Otherwise, get the form to create a new account
  145.         $user               = new User();
  146.         // If a user has invited their partner, a special registration link is generated so that the partner would not have to fill all fields
  147.         if ($partnerToken) {
  148.             //$partnerInfo    = $repoPartnerPending->findOneByToken($partnerToken);
  149.             $partnerInfo    null;
  150.             // We found a partnerPending
  151.             if ($partnerInfo) {
  152.                 $user
  153.                     ->setCivility($partnerInfo->getCivility())
  154.                     ->setFirstName($partnerInfo->getFirstname())
  155.                     ->setLastName($partnerInfo->getBirthname())
  156.                     ->setEmail($partnerInfo->getEmail())
  157.                     ->setPhoneNumber($partnerInfo->getPhoneNumber())
  158.                     ->setPartnerLead($partnerInfo->getPartner());
  159.             }
  160.         }
  161.         $user->setEmail($email);
  162.         $form               $this->createForm(RegistrationFormType::class, $user);
  163.         $form->handleRequest($request);
  164.         if ($form->isSubmitted() && $form->isValid()) {
  165.             // encode the plain password
  166.             $user->setPassword(
  167.                 $passwordHasher->hashPassword(
  168.                     $user,
  169.                     $form->get('plainPassword')->getData()
  170.                 )
  171.             );
  172.             $entityManager  $this->getDoctrine()->getManager();
  173.             $entityManager->persist($user);
  174.             $entityManager->flush();
  175.             if ($partnerToken && $partnerInfo) {
  176.                 // The one who sent a message to have a partnership with s.o else, should be linked to this new partner
  177.                 $partner    $partnerInfo->getPartner();
  178.                 $partner->setPartnerLead($user);
  179.                 $entityManager->persist($partner);
  180.                 // Delete the PartnerPending as it's been used
  181.                 $entityManager->remove($partnerInfo);
  182.                 $entityManager->flush();
  183.             }
  184.             // generate a signed url and email it to the user
  185.             $this->emailVerifier->sendEmailConfirmation(
  186.                 'verify_email',
  187.                 $user,
  188.                 (new DefaultTemplatedEmail())
  189.                     ->to($user->getEmail())
  190.                     ->subject('Veuillez confirmer votre e-mail')
  191.                     ->htmlTemplate('Mail/welcome.html.twig')
  192.             );
  193.             $session->set('self_validating_authentication_options', [
  194.                 'redirect_to' => 'user_email_confirmation',
  195.                 'user_id' => $user->getId()
  196.             ]);
  197.             $session->remove("login_register_email");
  198.             return $this->redirectToRoute('user_email_confirmation');
  199.             //return $this->redirectToRoute('self_validating_authentication');
  200.         }
  201.         return $this->render('Registration/register.html.twig', [
  202.             'form' => $form->createView(),
  203.         ]);
  204.     }
  205.     /**
  206.      * @Route("/verify/email", name="verify_email")
  207.      * @param Request                $request
  208.      * @param EntityManagerInterface $manager
  209.      *
  210.      * @return Response
  211.      */
  212.     public function verifyUserEmail(Request $requestEntityManagerInterface $manager): Response
  213.     {
  214.         $id $request->get('id');
  215.         if (null === $id) {
  216.             return $this->redirectToRoute('register');
  217.         }
  218.         $repository $manager->getRepository(User::class);
  219.         $user $repository->find($id);
  220.         if (null === $user) {
  221.             return $this->redirectToRoute('register');
  222.         }
  223.         // validate email confirmation link, sets User::isVerified=true and persists
  224.         try {
  225.             $this->emailVerifier->handleEmailConfirmation($request$user);
  226.         } catch (VerifyEmailExceptionInterface $exception) {
  227.             $this->addFlash('verify_email_error'$exception->getReason());
  228.             return $this->redirectToRoute('register');
  229.         }
  230.         // @TODO Change the redirect on success and handle or remove the flash message in your templates
  231.         $this->addFlash('success'"Votre e-mail est vérifié et votre compte est maintenant validé.");
  232.         return $this->redirectToRoute('login');
  233.     }
  234. }