src/Controller/RegistrationController.php line 56

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\City;
  4. use App\Entity\RealEstateAgent;
  5. use App\Entity\Region;
  6. use App\Entity\User;
  7. use App\Form\RegistrationCompanyProfileType;
  8. use App\Form\RegistrationFormType;
  9. use App\Form\RegistrationProfessionalProfileType;
  10. use App\Form\RegistrationProjectLeaderType;
  11. use App\Form\RegistrationRealEstateProfileType;
  12. use App\Form\RegistrationTerritoryType;
  13. use App\Security\EmailVerifier;
  14. use App\Service\CompanySender;
  15. use App\Service\CompanyService;
  16. use App\Service\MailManager;
  17. use App\Service\TerritorySender;
  18. use Doctrine\Persistence\ManagerRegistry;
  19. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  20. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  21. use Symfony\Component\Form\FormFactoryInterface;
  22. use Symfony\Component\HttpFoundation\Request;
  23. use Symfony\Component\HttpFoundation\Response;
  24. use Symfony\Component\Mime\Address;
  25. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  26. use Symfony\Component\Routing\Annotation\Route;
  27. use Symfony\Component\Security\Http\Authentication\UserAuthenticatorInterface;
  28. use Symfony\Component\Security\Http\Authenticator\FormLoginAuthenticator;
  29. use Symfony\Contracts\Translation\TranslatorInterface;
  30. use SymfonyCasts\Bundle\VerifyEmail\Exception\VerifyEmailExceptionInterface;
  31. use function Symfony\Component\String\u;
  32. class RegistrationController extends AbstractController
  33. {
  34.     /** @var EmailVerifier  */
  35.     private $emailVerifier;
  36.     public function __construct(EmailVerifier $emailVerifier)
  37.     {
  38.         $this->emailVerifier $emailVerifier;
  39.     }
  40.     /**
  41.      * @Route({
  42.      *     "en": "/register",
  43.      *     "fr": "/inscription"
  44.      * }, name="app_register")
  45.      * @param Request $request
  46.      * @param UserPasswordHasherInterface $userPasswordHasherInterface
  47.      * @param UserAuthenticatorInterface $userAuthenticator
  48.      * @param FormLoginAuthenticator $formLoginAuthenticator
  49.      * @return Response
  50.      */
  51.     public function register(
  52.         Request $request,
  53.         UserPasswordHasherInterface $userPasswordHasherInterface,
  54.         UserAuthenticatorInterface $userAuthenticator,
  55.         FormLoginAuthenticator $formLoginAuthenticator,
  56.         ManagerRegistry $registry,
  57.         TranslatorInterface $translator
  58.     ): Response
  59.     {
  60.         $user = new User();
  61.         $form $this->createForm(RegistrationFormType::class, $user);
  62.         $form->handleRequest($request);
  63.         if ($form->isSubmitted() && $form->isValid()) {
  64.             $user->setRoles([User::ROLE_CANDIDATE]);
  65.             // encode the plain password
  66.             $user->setPassword(
  67.             $userPasswordHasherInterface->hashPassword(
  68.                     $user,
  69.                     $form->get('plainPassword')->getData()
  70.                 )
  71.             );
  72.             $user->setRegisterPage(User::REGISTER_PAGE);
  73.             $entityManager $registry->getManager();
  74.             $entityManager->persist($user->getPerson());
  75.             $entityManager->persist($user);
  76.             $entityManager->flush();
  77.             // generate a signed url and email it to the user
  78.             $this->emailVerifier->sendEmailConfirmation('app_verify_email'$user,
  79.                 (new TemplatedEmail())
  80.                     ->from(new Address('notifications@paris-jetequitte.com''Paris Je Te Quitte'))
  81.                     ->to($user->getEmail())
  82.                     ->subject($translator->trans('template_email.register.subject'))
  83.                     ->htmlTemplate('email/security/register.html.twig')
  84.             );
  85.             $utms =  ['utm_source''utm_medium''utm_campaign''utm_term''utm_content'];
  86.             $utmParams = [];
  87.             foreach ($utms as $utm) {
  88.                 if ($request->query->get($utm)) {
  89.                     $utmParams[$utm] = $request->query->get($utm);
  90.                 }
  91.             }
  92.             return $this->redirectToRoute('app_register_candidate_success'$utmParams);
  93.         }
  94.         return $this->render('registration/register.html.twig', [
  95.             'registrationForm' => $form->createView(),
  96.         ]);
  97.     }
  98.     /**
  99.      * @Route({
  100.      *     "en": "/success",
  101.      *     "fr": "/compte-crée"
  102.      * }, name="app_register_candidate_success")
  103.      */
  104.     public function registerCandidateSuccess(): Response
  105.     {
  106.         return $this->renderForm(
  107.             'registration/register_candidate_success.html.twig',
  108.             [
  109.             ]
  110.         );
  111.     }
  112.     /**
  113.      * @Route({
  114.      *     "en": "/your-project/success",
  115.      *     "fr": "/ton-projet/success"
  116.      * }, name="app_landing_candidate_success")
  117.      */
  118.     public function landingCandidateSuccess(): Response
  119.     {
  120.         return $this->renderForm(
  121.             'registration/landing_candidate_success.html.twig'
  122.         );
  123.     }
  124.     /**
  125.      * @Route({
  126.      *     "en": "/your-project",
  127.      *     "fr": "/ton-projet"
  128.      * }, name="app_your_project")
  129.      * @param Request $request
  130.      * @param UserPasswordHasherInterface $userPasswordHasherInterface
  131.      * @param UserAuthenticatorInterface $userAuthenticator
  132.      * @param FormLoginAuthenticator $formLoginAuthenticator
  133.      * @return Response
  134.      */
  135.     public function landing(
  136.         Request $request,
  137.         UserPasswordHasherInterface $userPasswordHasherInterface,
  138.         UserAuthenticatorInterface $userAuthenticator,
  139.         FormLoginAuthenticator $formLoginAuthenticator,
  140.         ManagerRegistry $registry,
  141.         TranslatorInterface $translator,
  142.         MailManager $mailManager
  143.     ): Response
  144.     {
  145.         $user = new User();
  146.         $form $this->createForm(RegistrationProfessionalProfileType::class, $user);
  147.         $form->handleRequest($request);
  148.         if ($form->isSubmitted() && $form->isValid()) {
  149.             $entityManager $registry->getManager();
  150.             $user->setRoles([User::ROLE_CANDIDATE]);
  151.             $profile $user->getProfessionalProfile();
  152.             $profile->initByProfileType();
  153.             if ($profile->getRegions()->isEmpty()) {
  154.                 $regions $entityManager->getRepository(Region::class)
  155.                     ->findAll();
  156.                 foreach ($regions as $region) {
  157.                     $profile->addRegion($region);
  158.                 }
  159.             }
  160.             $cities $request->request->get('cities', []);
  161.             foreach ($cities as $cityId) {
  162.                 $city $entityManager->getRepository(City::class)
  163.                     ->find($cityId);
  164.                 if ($city) {
  165.                     $profile->addCity($city);
  166.                 }
  167.             }
  168.             $utms =  ['utm_source''utm_medium''utm_campaign''utm_term''utm_content'];
  169.             foreach ($utms as $utm) {
  170.                 if ($request->query->get($utm)) {
  171.                     $profile->{'set' u($utm)->camel()}($request->query->get($utm));
  172.                 }
  173.             }
  174.             // encode the plain password
  175.             $user->setPassword(
  176.                 $userPasswordHasherInterface->hashPassword(
  177.                     $user,
  178.                     $form->get('plainPassword')->getData()
  179.                 )
  180.             );
  181.             $user->setRegisterPage(User::LANDING_PAGE);
  182.             $entityManager->persist($user->getPerson());
  183.             $entityManager->persist($user);
  184.             $entityManager->persist($profile);
  185.             $entityManager->flush();
  186.             // generate a signed url and email it to the user
  187.             $this->emailVerifier->sendEmailConfirmation('app_verify_email'$user,
  188.                  (new TemplatedEmail())
  189.                      ->from(new Address('notifications@paris-jetequitte.com''Paris Je Te Quitte'))
  190.                      ->to($user->getEmail())
  191.                      ->subject($translator->trans('template_email.register.subject'))
  192.                      ->htmlTemplate('email/security/register.html.twig')
  193.             );
  194.             $profile->setUser($user);
  195.             $mailManager->notificationCreateProfessionalProfile($profile'Landing');
  196.             //$this->addFlash('success', "Bienvenue sur Paris Je Te Quitte, nous venons de t'envoyer un e-mail afin de valider ton compte");
  197.             return $this->redirectToRoute('app_landing_candidate_success');
  198.         }
  199.         return $this->render('registration/landing.html.twig', [
  200.             'registrationForm' => $form->createView(),
  201.         ]);
  202.     }
  203.     /**
  204.      * @Route("/verify/email", name="app_verify_email")
  205.      */
  206.     public function verifyUserEmail(Request $requestMailManager $mailManager): Response
  207.     {
  208.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  209.         // validate email confirmation link, sets User::isVerified=true and persists
  210.         try {
  211.             $this->emailVerifier->handleEmailConfirmation($request$this->getUser());
  212.         } catch (VerifyEmailExceptionInterface $exception) {
  213.             $this->addFlash('verify_email_error'$exception->getReason());
  214.             return $this->redirectToRoute('app_register');
  215.         }
  216.         /** @var User $user */
  217.         $user $this->getUser();
  218.         $mailManager->welcomeCandidate($user);
  219.         $this->addFlash('success''Votre e-mail a bien été validé.');
  220.         switch ($user->getRegisterPage()) {
  221.             case User::LANDING_PAGE:
  222.                 return $this->redirectToRoute('app_candidate_index');
  223.             default:
  224.                 if ($user->getProfessionalProfile()) {
  225.                     return $this->redirectToRoute('app_candidate_index');
  226.                 }
  227.                 return $this->redirectToRoute('app_candidate_onboarding_myprofile');
  228.         }
  229.     }
  230.     /**
  231.      * @Route("/inscription/territoire", name="app_register_territory")
  232.      * @param Request $request
  233.      * @param UserPasswordHasherInterface $userPasswordHasherInterface
  234.      * @param UserAuthenticatorInterface $userAuthenticator
  235.      * @param FormLoginAuthenticator $formLoginAuthenticator
  236.      * @return Response
  237.      */
  238.     public function registerTerritory(
  239.         Request $request,
  240.         UserPasswordHasherInterface $userPasswordHasherInterface,
  241.         ManagerRegistry $registry,
  242.         TerritorySender $sender
  243.     ): Response
  244.     {
  245.         $user = new User();
  246.         $form $this->createForm(RegistrationTerritoryType::class, $user);
  247.         $form->handleRequest($request);
  248.         if ($form->isSubmitted() && $form->isValid()) {
  249.             $territory $user->getTerritory();
  250.             $user->setTerritory(null);
  251.             $user->setRoles([User::ROLE_TERRITORY]);
  252.             // encode the plain password
  253.             $user->setPassword(
  254.                 $userPasswordHasherInterface->hashPassword(
  255.                     $user,
  256.                     $form->get('plainPassword')->getData()
  257.                 )
  258.             );
  259.             $entityManager $registry->getManager();
  260.             $entityManager->persist($user->getPerson());
  261.             $entityManager->persist($user);
  262.             $entityManager->flush();
  263.             $sender->notifyAdminNewUser($user$territory);
  264.             // generate a signed url and email it to the user
  265.             /*$this->emailVerifier->sendEmailConfirmation('app_verify_email', $user,
  266.                 (new TemplatedEmail())
  267.                     ->from(new Address('notifications@paris-jetequitte.com', 'Paris Je Te Quitte'))
  268.                     ->to($user->getEmail())
  269.                     ->subject($translator->trans('template_email.register.subject'))
  270.                     ->htmlTemplate('email/security/register.html.twig')
  271.             );*/
  272.             return $this->redirectToRoute('app_register_territory_success');
  273.         }
  274.         return $this->render('registration/register_territory.html.twig', [
  275.             'registrationForm' => $form->createView(),
  276.         ]);
  277.     }
  278.     /**
  279.      * @Route("/inscription/annonce", name="app_register_project_leader")
  280.      * @param Request $request
  281.      * @param UserPasswordHasherInterface $userPasswordHasherInterface
  282.      * @param UserAuthenticatorInterface $userAuthenticator
  283.      * @param FormLoginAuthenticator $formLoginAuthenticator
  284.      * @return Response
  285.      */
  286.     public function registerProjectLeader(
  287.         Request $request,
  288.         UserPasswordHasherInterface $userPasswordHasherInterface,
  289.         ManagerRegistry $registry,
  290.         UserAuthenticatorInterface $userAuthenticator,
  291.         FormLoginAuthenticator $formLoginAuthenticator
  292.     ): Response
  293.     {
  294.         $user = new User();
  295.         $form $this->createForm(RegistrationProjectLeaderType::class, $user);
  296.         $form->handleRequest($request);
  297.         if ($form->isSubmitted() && $form->isValid()) {
  298.             // encode the plain password
  299.             $user->setPassword(
  300.                 $userPasswordHasherInterface->hashPassword(
  301.                     $user,
  302.                     $form->get('plainPassword')->getData()
  303.                 )
  304.             );
  305.             switch ($form->get('typeProject')->getData()) {
  306.                 case 'estate':
  307.                     $user->setRoles([User::ROLE_PROJECT_ESTATE]);
  308.                     break;
  309.                 case 'project':
  310.                     $user->setRoles([User::ROLE_PROJECT_OPPORTUNITY]);
  311.                     break;
  312.                 default:
  313.                     throw new \Exception();
  314.             }
  315.             $entityManager $registry->getManager();
  316.             $entityManager->persist($user->getPerson());
  317.             $entityManager->persist($user);
  318.             $entityManager->flush();
  319.             // generate a signed url and email it to the user
  320.             /*$this->emailVerifier->sendEmailConfirmation('app_verify_email', $user,
  321.                 (new TemplatedEmail())
  322.                     ->from(new Address('notifications@paris-jetequitte.com', 'Paris Je Te Quitte'))
  323.                     ->to($user->getEmail())
  324.                     ->subject($translator->trans('template_email.register.subject'))
  325.                     ->htmlTemplate('email/security/register.html.twig')
  326.             );*/
  327.             $userAuthenticator->authenticateUser(
  328.                 $user,
  329.                 $formLoginAuthenticator,
  330.                 $request
  331.             );
  332.             return $this->redirectToRoute('app_project_leader_index');
  333.         }
  334.         return $this->render('registration/register_project_leader.html.twig', [
  335.             'registrationForm' => $form->createView(),
  336.         ]);
  337.     }
  338.     /**
  339.      * @Route("/inscription/territoire/confirmation", name="app_register_territory_success")
  340.      * @return Response
  341.      */
  342.     public function registerTerritorySuccess(): Response
  343.     {
  344.         return $this->render('registration/register_territory_success.html.twig', [
  345.         ]);
  346.     }
  347.     /**
  348.      * @Route("/inscription/entreprise/confirmation", name="app_register_company_success")
  349.      * @return Response
  350.      */
  351.     public function registerCompanySuccess(): Response
  352.     {
  353.         return $this->render('registration/register_company_success.html.twig', [
  354.         ]);
  355.     }
  356.     /**
  357.      * @Route("/inscription/entreprise", name="app_register_company")
  358.      * @param Request $request
  359.      * @param UserPasswordHasherInterface $userPasswordHasherInterface
  360.      * @param UserAuthenticatorInterface $userAuthenticator
  361.      * @param FormLoginAuthenticator $formLoginAuthenticator
  362.      * @return Response
  363.      */
  364.     public function registerCompanyProfile(
  365.         Request $request,
  366.         UserPasswordHasherInterface $userPasswordHasherInterface,
  367.         UserAuthenticatorInterface $userAuthenticator,
  368.         FormLoginAuthenticator $formLoginAuthenticator,
  369.         ManagerRegistry $registry,
  370.         TranslatorInterface $translator,
  371.         CompanyService $companyService,
  372.         CompanySender $sender
  373.     ): Response
  374.     {
  375.         $user = new User();
  376.         $form $this->createForm(RegistrationCompanyProfileType::class, $user);
  377.         $form->handleRequest($request);
  378.         if ($form->isSubmitted() && $form->isValid()) {
  379.             $user->setRoles([User::ROLE_COMPANY]);
  380.             $user->setPassword(
  381.                 $userPasswordHasherInterface->hashPassword(
  382.                     $user,
  383.                     $form->get('plainPassword')->getData()
  384.                 )
  385.             );
  386.             $company $user->getCompanyProfile();
  387.             $companyService->init($company);
  388.             $entityManager $registry->getManager();
  389.             $entityManager->persist($user->getPerson());
  390.             $entityManager->persist($user);
  391.             $entityManager->persist($user->getCompanyProfile());
  392.             $entityManager->flush();
  393.             $sender->notifyAdminNewUser($user$company);
  394.             /*// generate a signed url and email it to the user
  395.             $this->emailVerifier->sendEmailConfirmation('app_verify_email', $user,
  396.                 (new TemplatedEmail())
  397.                     ->from(new Address('notifications@paris-jetequitte.com', 'Paris Je Te Quitte'))
  398.                     ->to($user->getEmail())
  399.                     ->subject($translator->trans('template_email.register.subject'))
  400.                     ->htmlTemplate('email/security/register.html.twig')
  401.             );*/
  402.             // do anything else you need here, like send an email
  403.             $userAuthenticator->authenticateUser(
  404.                 $user,
  405.                 $formLoginAuthenticator,
  406.                 $request
  407.             );
  408.             return $this->redirectToRoute('app_company_profile_onboarding_profile');
  409.         }
  410.         return $this->render('registration/register_company_profile.html.twig', [
  411.             'registrationForm' => $form->createView(),
  412.         ]);
  413.     }
  414.     /**
  415.      * @Route("/inscription/agence-immobiliere", name="app_register_real_estate")
  416.      * @param Request $request
  417.      * @param UserPasswordHasherInterface $userPasswordHasherInterface
  418.      * @param UserAuthenticatorInterface $userAuthenticator
  419.      * @param FormLoginAuthenticator $formLoginAuthenticator
  420.      * @return Response
  421.      */
  422.     public function registerRealEstate(
  423.         Request $request,
  424.         UserPasswordHasherInterface $userPasswordHasherInterface,
  425.         UserAuthenticatorInterface $userAuthenticator,
  426.         FormLoginAuthenticator $formLoginAuthenticator,
  427.         ManagerRegistry $registry,
  428.         TranslatorInterface $translator
  429.     ): Response
  430.     {
  431.         $user = new User();
  432.         $form $this->createForm(RegistrationRealEstateProfileType::class, $user);
  433.         $form->handleRequest($request);
  434.         if ($form->isSubmitted() && $form->isValid()) {
  435.             $user->setRoles([User::ROLE_ADMIN_REAL_ESTATE]);
  436.             $user->setPassword(
  437.                 $userPasswordHasherInterface->hashPassword(
  438.                     $user,
  439.                     $form->get('plainPassword')->getData()
  440.                 )
  441.             );
  442.             $realEstate $user->getRealEstateProfile();
  443.             $agent = new RealEstateAgent();
  444.             $agent->setRealEstate($realEstate);
  445.             $agent->setPerson($user->getPerson());
  446.             $entityManager $registry->getManager();
  447.             $entityManager->persist($user->getPerson());
  448.             $entityManager->persist($user);
  449.             $entityManager->persist($agent);
  450.             $entityManager->persist($realEstate);
  451.             $entityManager->flush();
  452.             // generate a signed url and email it to the user
  453.             /*$this->emailVerifier->sendEmailConfirmation('app_verify_email', $user,
  454.                 (new TemplatedEmail())
  455.                     ->from(new Address('notifications@paris-jetequitte.com', 'Paris Je Te Quitte'))
  456.                     ->to($user->getEmail())
  457.                     ->subject($translator->trans('template_email.register.subject'))
  458.                     ->htmlTemplate('email/security/register.html.twig')
  459.             );*/
  460.             // do anything else you need here, like send an email
  461.             $userAuthenticator->authenticateUser(
  462.                 $user,
  463.                 $formLoginAuthenticator,
  464.                 $request
  465.             );
  466.             return $this->redirectToRoute('app_real_estate_profile_index');
  467.         }
  468.         return $this->render('registration/register_real_estate_profile.html.twig', [
  469.             'registrationForm' => $form->createView(),
  470.         ]);
  471.     }
  472. }