src/Controller/RegistrationController.php line 36

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\User;
  4. use App\Entity\UserRelation;
  5. use App\Form\RegistrationFormType;
  6. use App\Helper\EsfHelper;
  7. use App\Repository\UserRelationRepository;
  8. use App\Repository\UserRepository;
  9. use App\Security\EmailVerifier;
  10. use Doctrine\ORM\EntityManagerInterface;
  11. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  12. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  13. use Symfony\Component\Form\FormError;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\HttpFoundation\Response;
  16. use Symfony\Component\Mime\Address;
  17. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  18. use Symfony\Component\Routing\Annotation\Route;
  19. use SymfonyCasts\Bundle\VerifyEmail\Exception\VerifyEmailExceptionInterface;
  20. use function Doctrine\ORM\QueryBuilder;
  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("/register", name="app_register")
  30.      */
  31.     public function register(Request $request,
  32.                              UserPasswordHasherInterface $userPasswordHasher,
  33.                              EntityManagerInterface $entityManager,
  34.                              UserRepository $userRepository,
  35.                              EsfHelper $esfHelper,
  36.                              UserRelationRepository $userRelationRepository
  37.     ): Response
  38.     {
  39.         $user = new User();
  40.         $form $this->createForm(RegistrationFormType::class, $user);
  41.         $form->handleRequest($request);
  42.         if ($form->isSubmitted() && $form->isValid()) {
  43.             // overeni affiliate kodu
  44.             $affiliateKod = @$request->request->get('registration_form')['code'];
  45.             if(isset($affiliateKod) && strlen($affiliateKod) > 0){
  46.                 // check jestli edistuje master user podle kodu
  47.                 $boss $userRepository->findOneBy(['code' => $affiliateKod]);
  48.                 if(is_null($boss)){
  49.                     //$form->addError(new FormError('Zadaný affiliate kód nebyl nalezen'));
  50.                 }else{
  51.                     $userRelationRepository->create($boss$userUserRelation::TYPE_STRUCTURE);
  52.                 }
  53.             }
  54.             $user->setRoles([User::ROLE_MERCHANT]);
  55.             // zpracuji
  56.             if($form->isValid()) {
  57.                 $stmt $entityManager->getConnection()->prepare('SELECT DISTINCT(code) FROM `user` WHERE code IS NOT NULL');
  58.                 $return $stmt->executeQuery();
  59.                 $existingCodes $return->fetchAllAssociativeIndexed();
  60.                 $code $esfHelper->generateAffiliateCode($existingCodes);
  61.                 $user->setCode($code);
  62.                 $user->setPassword(
  63.                     $userPasswordHasher->hashPassword(
  64.                         $user,
  65.                         $form->get('plainPassword')->getData()
  66.                     )
  67.                 );
  68.                 $entityManager->persist($user);
  69.                 $entityManager->flush();
  70.                 $resetTplId $this->getParameter('REGISTRATION_TPL_SENDGRID_ID');
  71.                 $emailData $this->emailVerifier->getEmailConfirmation('app_verify_email'$user,
  72.                     [
  73.                         "template_id" => $resetTplId,
  74.                         "from" => array(
  75.                             "name" => "EFS",
  76.                             "email" => "info@efsgroup.cz"
  77.                         ),
  78.                         "personalizations" => array(
  79.                             array(
  80.                                 "dynamic_template_data" => [
  81.                                     "signedUrl" => "",
  82.                                     "name" => "",
  83.                                     "surname" => "",
  84.                                     "phone" => ""
  85.                                 ],
  86.                                 "to" => array(
  87.                                     array(
  88.                                         "email" => $user->getEmail()
  89.                                     ),
  90.                                 )
  91.                             )
  92.                         )
  93.                     ]
  94.                 );
  95.                 if (strlen($resetTplId) > 0) {
  96.                     // posilam potvrzovaci email s linkem pro prihlaseni
  97.                     $this->emailVerifier->sendEmailConfirmation($emailData);
  98.                 } else {
  99.                     // pokud neni nastaven mailer - automaticky presmeruju na potvrzovaci url
  100.                     return $this->redirect($emailData['personalizations'][0]['dynamic_template_data']['signedUrl']);
  101.                 }
  102.                 return $this->redirectToRoute('app_homepage');
  103.             }
  104.         }
  105.         return $this->render('registration/register.html.twig', [
  106.             'registrationForm' => $form->createView(),
  107.         ]);
  108.     }
  109.     /**
  110.      * @Route("/verify/email", name="app_verify_email")
  111.      */
  112.     public function verifyUserEmail(Request $requestUserRepository $userRepositoryEntityManagerInterface $entityManager): Response
  113.     {
  114.         $id $request->get('id');
  115.         if (null === $id) {
  116.             return $this->redirectToRoute('app_register');
  117.         }
  118.         $user $userRepository->find($id);
  119.         if (null === $user) {
  120.             return $this->redirectToRoute('app_register');
  121.         }
  122.         // validate email confirmation link, sets User::isVerified=true and persists
  123.         try {
  124.             $this->emailVerifier->handleEmailConfirmation($request$user);
  125.             // uzivatel nema vyplneny v registraci affilate code, tzn. je bez nadrizeneho, nastavim hned aktivni
  126.             // toto je pro uzivatele kupujici zlato.
  127.             if(count($user->getBosses()) == 0){
  128.                 $user->setActive(true);
  129.                 $entityManager->flush();
  130.             }
  131.             $this->addFlash('verify_email_success'"Emailová adresa byla úspěšně ověřena");
  132.         } catch (VerifyEmailExceptionInterface $exception) {
  133.             $this->addFlash('verify_email_error'$exception->getReason());
  134.             return $this->redirectToRoute('app_register');
  135.         }
  136.         $this->addFlash('success''Vaše e-mailová adresa byla ověřena');
  137.         return $this->redirectToRoute('app_login');
  138.     }
  139. }