src/Controller/Frontend/UserController.php line 126

  1. <?php
  2. namespace App\Controller\Frontend;
  3. use App\Entity\User;
  4. use App\Form\Type\UserRegisterType;
  5. use App\Repository\UserRepository;
  6. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  7. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  8. use Symfony\Component\HttpFoundation\Request;
  9. use Symfony\Component\HttpFoundation\Response;
  10. use Symfony\Component\Mailer\MailerInterface;
  11. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  12. use Symfony\Component\Routing\Annotation\Route;
  13. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  14. use SymfonyCasts\Bundle\VerifyEmail\Exception\ExpiredSignatureException;
  15. use SymfonyCasts\Bundle\VerifyEmail\Exception\VerifyEmailExceptionInterface;
  16. use SymfonyCasts\Bundle\VerifyEmail\VerifyEmailHelperInterface;
  17. class UserController extends AbstractController
  18. {
  19.     #[Route('/register'name'user.register'methods: ['GET''POST'])]
  20.     public function register(
  21.         Request $request,
  22.         UserRepository $repo,
  23.         UserPasswordHasherInterface $userPasswordHasher,
  24.         VerifyEmailHelperInterface $verifyEmailHelper,
  25.         MailerInterface $mailer
  26.     ): Response
  27.     {
  28.         $user = new User();
  29.         $form $this->createForm(UserRegisterType::class, $user);
  30.         $form->handleRequest($request);
  31.         if ($form->isSubmitted() && $form->isValid()) {
  32.             $user $form->getData();
  33.             $existingUser $repo->findOneBy(['email' => $user->getEmail()]);
  34.             if ($existingUser) {
  35.                 $this->addFlash('danger''User with that email already exists!');
  36.                 return $this->redirectToRoute('user.register');
  37.             }
  38.             $user->setPassword(
  39.                 $userPasswordHasher->hashPassword(
  40.                     $user,
  41.                     $form->get('plain_password')->getData()
  42.                 )
  43.             );
  44.             $repo->save($usertrue);
  45.             $signatureComponents $verifyEmailHelper->generateSignature(
  46.                 'user.register.confirm',
  47.                 $user->getId(),
  48.                 $user->getEmail(),
  49.                 ['id' => $user->getId()] // add the user's id as an extra query param
  50.             );
  51.             $email = (new TemplatedEmail())
  52.                 ->to($user->getEmail())
  53.                 ->subject('Confirm your email address')
  54.                 ->htmlTemplate('Frontend/Mail/RegisterConfirm.twig')
  55.                 ->context([
  56.                     'signed_url'      => $signatureComponents->getSignedUrl(),
  57.                     'expiration_date' => new \DateTime('+7 days'),
  58.                 ])
  59.             ;
  60.             $mailer->send($email);
  61.             $this->addFlash('success''Thanks for your registration! You will receive a mail with a link to confirm your email address shortly.');
  62.             return $this->redirectToRoute('video.index');
  63.         }
  64.         return $this->render('Frontend/User/Register.twig', [
  65.             'form' => $form,
  66.         ]);
  67.     }
  68.     #[Route('/register-confirm'name'user.register.confirm'methods: ['GET'])]
  69.     public function registerConfirm(
  70.         Request $request,
  71.         UserRepository $repo,
  72.         VerifyEmailHelperInterface $verifyEmailHelper
  73.     )
  74.     {
  75.         $id $request->get('id');
  76.         if (!$id) {
  77.             $this->addFlash('danger''Invalid params (1)!');
  78.             return $this->redirectToRoute('user.register');
  79.         }
  80.         $user $repo->find($id);
  81.         if (!$user) {
  82.             $this->addFlash('danger''Invalid params (2)!');
  83.             return $this->redirectToRoute('user.register');
  84.         }
  85.         try {
  86.             $verifyEmailHelper->validateEmailConfirmation($request->getUri(), $user->getId(), $user->getEmail());
  87.         } catch (VerifyEmailExceptionInterface $e) {
  88.             if ($e instanceof  ExpiredSignatureException) {
  89.                 $this->addFlash('danger''Link has already expired!');
  90.             } else {
  91.                 $this->addFlash('danger''Invalid params (1)!');
  92.             }
  93.             return $this->redirectToRoute('user.register');
  94.         }
  95.         $this->addFlash('success''Thanks, your registration is now complete!');
  96.         return $this->redirectToRoute('user.login');
  97.     }
  98.     // TODO PasswordReset
  99.     // TODO PasswordChange
  100.     #[Route('/login'name'user.login'methods: ['GET''POST'])]
  101.     public function login(Request $requestAuthenticationUtils $authenticationUtils)
  102.     {
  103.         // get the login error if there is one
  104.         $error $authenticationUtils->getLastAuthenticationError();
  105.         // last username entered by the user
  106.         $lastUsername $authenticationUtils->getLastUsername();
  107.         return $this->render('Frontend/User/Login.twig', [
  108.             'last_username' => $lastUsername,
  109.             'error'         => $error,
  110.         ]);
  111.     }
  112.     #[Route('/logout'name'user.logout'methods: ['GET'])]
  113.     public function logout()
  114.     {
  115.         // controller can be blank: it will never be called!
  116.         throw new \Exception('Don\'t forget to activate logout in security.yaml');
  117.     }
  118. }