src/Controller/RegistrationController.php line 58

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Connector\ConfirmUserDataInterface;
  4. use App\Entity\User;
  5. use App\Form\AbstractRegisterUserType;
  6. use App\Form\RegisterUserType;
  7. use App\Repository\UserRepository;
  8. use App\Security\EmailVerifier;
  9. use App\Service\NotificationFactory;
  10. use App\Service\RegistrationEmailFactoryInterface;
  11. use DateTime;
  12. use Doctrine\ORM\EntityManagerInterface;
  13. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  14. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  15. use Symfony\Component\HttpFoundation\Request;
  16. use Symfony\Component\HttpFoundation\Response;
  17. use Symfony\Component\Mime\Address;
  18. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  19. use Symfony\Component\Routing\Annotation\Route;
  20. use Symfony\Contracts\Translation\TranslatorInterface;
  21. use SymfonyCasts\Bundle\VerifyEmail\Exception\VerifyEmailExceptionInterface;
  22. class RegistrationController extends AbstractController
  23. {
  24.     private EmailVerifier $emailVerifier;
  25.     private NotificationFactory $notificationFactory;
  26.     private ConfirmUserDataInterface $confirmUserData;
  27.     private RegistrationEmailFactoryInterface $registrationEmailFactory;
  28.     private bool $automaticPremium;
  29.     private string $automaticPremiumDuration;
  30.     public function __construct(
  31.         EmailVerifier            $emailVerifier,
  32.         NotificationFactory      $notificationFactory,
  33.         ConfirmUserDataInterface $confirmUserData,
  34.         RegistrationEmailFactoryInterface $registrationEmailFactory,
  35.         bool $automaticPremium,
  36.         string $automaticPremiumDuration
  37.     )
  38.     {
  39.         $this->emailVerifier $emailVerifier;
  40.         $this->notificationFactory $notificationFactory;
  41.         $this->confirmUserData $confirmUserData;
  42.         $this->registrationEmailFactory $registrationEmailFactory;
  43.         $this->automaticPremium $automaticPremium;
  44.         $this->automaticPremiumDuration $automaticPremiumDuration;
  45.     }
  46.     /**
  47.      * @Route("/register", name="app_register")
  48.      */
  49.     public function register(Request $requestUserPasswordHasherInterface $userPasswordHasherEntityManagerInterface $entityManager): Response
  50.     {
  51.         if ($this->getUser()) return $this->redirectToRoute('main');
  52.         $form $this->createForm(RegisterUserType::class, $user = new User());
  53.         $form->handleRequest($request);
  54.         if ($form->isSubmitted() && $form->isValid()) {
  55.             // encode the plain password
  56.             $user->setPassword(
  57.                 $userPasswordHasher->hashPassword(
  58.                     $user,
  59.                     $form->get(AbstractRegisterUserType::PLAIN_PASSWORD_FIELD_NAME)->getData()
  60.                 )
  61.             );
  62.             if (
  63.                 $pkdVerified $this->confirmUserData->getUserConfirmationData(
  64.                     $form->getData()
  65.                 )->isCanFullRegistration()
  66.             ) {
  67.                 $this->notificationFactory->addSuccess('mailing.send.registration.pkdVerified.success');
  68.             } else {
  69.                 $this->notificationFactory->addWarning('mailing.send.registration.pkdVerified.warning');
  70.             }
  71.             $user->setPkdVerified($pkdVerified);
  72.             if ($this->automaticPremium){
  73.                 $user->setPremiumTo(
  74.                     (new DateTime())->modify($this->automaticPremiumDuration)
  75.                 );
  76.             }
  77.             $entityManager->persist($user);
  78.             $entityManager->flush();
  79.             // generate a signed url and email it to the user
  80.             $this->emailVerifier->sendEmailConfirmation(
  81.                 'app_verify_email',
  82.                 $user,
  83.                 $this->registrationEmailFactory->getRegistrationEmail($user->getEmail())
  84. //                (new TemplatedEmail())
  85. //                    ->from(new Address('podpadziochy@podpadziochy.pl', 'Podpadziochy'))
  86. //                    ->to($user->getEmail())
  87. //                    ->subject('Proszę potwierdź swój mail')
  88. //                    ->htmlTemplate('registration/confirmation_email.html.twig')
  89.             );
  90.             $this->notificationFactory->addSuccess('mailing.send.registration.success');
  91.             // do anything else you need here, like send an email
  92.             return $this->redirectToRoute('app_login');
  93.         }
  94.         return $this->render('registration/register.html.twig', [
  95.             'registrationForm' => $form->createView(),
  96.         ]);
  97.     }
  98.     /**
  99.      * @Route("/verify/email", name="app_verify_email")
  100.      */
  101.     public function verifyUserEmail(Request $requestTranslatorInterface $translatorUserRepository $userRepository): Response
  102.     {
  103.         $id $request->get('id');
  104.         if (null === $id) {
  105.             return $this->redirectToRoute('app_register');
  106.         }
  107.         $user $userRepository->find($id);
  108.         if (null === $user) {
  109.             return $this->redirectToRoute('app_register');
  110.         }
  111.         // validate email confirmation link, sets User::isVerified=true and persists
  112.         try {
  113.             $this->emailVerifier->handleEmailConfirmation($request$user);
  114.         } catch (VerifyEmailExceptionInterface $exception) {
  115.             $this->addFlash('warning'$translator->trans($exception->getReason(), [], 'VerifyEmailBundle'));
  116.             return $this->redirectToRoute('app_register');
  117.         }
  118.         // @TODO Change the redirect on success and handle or remove the flash message in your templates
  119.         $this->notificationFactory->addSuccess('mailing.send.mail_confirmation.success');
  120.         return $this->redirectToRoute('app_login');
  121.     }
  122. }