src/Controller/RegistrationController.php line 35
<?phpnamespace App\Controller;use App\Entity\User;use App\Form\RegistrationFormType;use App\Repository\UserRepository;use Doctrine\ORM\EntityManagerInterface;use Symfony\Bridge\Twig\Mime\TemplatedEmail;use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;use Symfony\Component\HttpFoundation\Request;use Symfony\Component\HttpFoundation\RequestStack;use Symfony\Component\HttpFoundation\Response;use Symfony\Component\Mailer\MailerInterface;use Symfony\Component\Mime\Address;use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;use Symfony\Component\Routing\Annotation\Route;use SymfonyCasts\Bundle\VerifyEmail\Exception\VerifyEmailExceptionInterface;use SymfonyCasts\Bundle\VerifyEmail\VerifyEmailHelperInterface;class RegistrationController extends AbstractController{private $verifyEmailHelper;private $requestStack;private $mailer;public function __construct(RequestStack $requestStack, VerifyEmailHelperInterface $helper, MailerInterface $mailer){$this->requestStack = $requestStack;$this->verifyEmailHelper = $helper;$this->mailer = $mailer;}#[Route('/register', name: 'app_register')]public function register(Request $request, UserPasswordHasherInterface $userPasswordHasher, EntityManagerInterface $entityManager): Response{if ($this->getUser()) {return $this->redirectToRoute('home');}$user = new User();$form = $this->createForm(RegistrationFormType::class, $user);$form->handleRequest($request);if ($form->isSubmitted() && $form->isValid()) {// encode the plain password$user->setPassword($userPasswordHasher->hashPassword($user,$form->get('plainPassword')->getData()));$entityManager->persist($user);$entityManager->flush();// generate a signed url and email it to the user$signatureComponents = $this->verifyEmailHelper->generateSignature('registration_confirmation_route',$user->getId(),$user->getEmail(),['id' => $user->getId()] // add the user's id as an extra query param);$email = new TemplatedEmail();$email->from(new Address('metalead@preprod.my-site-web.com', 'Contact Metalead'));$email->to($user->getEmail());$email->subject('Confirmer votre email');$email->htmlTemplate('emails/confirm-account.html.twig');$email->context(['signedUrl' => $signatureComponents->getSignedUrl(), 'user' => $user]);$this->mailer->send($email);// do anything else you need here, like send an email$this->addFlash('success', 'Votre inscription a bien été enregistrée. Vous devez valider votre email avant de vous connecter. Si besoin, pensez à consulter vos spams.');return $this->redirectToRoute('app_login');}return $this->render('security/register.html.twig', ['registrationForm' => $form->createView(),]);}#[Route('/verify', name: 'registration_confirmation_route')]public function verifyUserEmail(Request $request, UserRepository $userRepository, EntityManagerInterface $entityManager): Response{if ($this->getUser()) {return $this->redirectToRoute('home');}$id = $request->get('id'); // retrieve the user id from the url// Verify the user id exists and is not nullif (null === $id) {return $this->redirectToRoute('home');}$user = $userRepository->find($id);// Ensure the user exists in persistenceif (null === $user) {return $this->redirectToRoute('home');}// Do not get the User's Id or Email Address from the Request objecttry {$this->verifyEmailHelper->validateEmailConfirmation($request->getUri(), $user->getId(), $user->getEmail());} catch (VerifyEmailExceptionInterface $e) {$this->addFlash('verify_email_error', $e->getReason());return $this->render('vitrine/confirmEmailFailed.html.twig', ['content' => $e->getReason(),'id' => $user->getId()]);}// Mark your user as verified. e.g. switch a User::verified property to true$user->setIsVerified(true);$entityManager->persist($user);$entityManager->flush();$this->addFlash('success', 'Votre email a bien été vérifié.');return $this->redirectToRoute('home');}#[Route('/resend/{id}', name: 'registration_resend_route')]public function resend(User $user): Response{if ($this->getUser()) {return $this->redirectToRoute('home');}$signatureComponents = $this->verifyEmailHelper->generateSignature('registration_confirmation_route',$user->getId(),$user->getEmail(),['id' => $user->getId()] // add the user's id as an extra query param);$email = new TemplatedEmail();$email->from(new Address('metalead@preprod.my-site-web.com', 'Contact Metalead'));$email->to($user->getEmail());$email->subject('Confirmer votre email');$email->htmlTemplate('emails/confirm-account.html.twig');$email->context(['signedUrl' => $signatureComponents->getSignedUrl(), 'user' => $user]);$this->mailer->send($email);$this->addFlash('success', 'Un nouveau mail pour confirmer votre compte vient de vous être envoyé');return $this->redirectToRoute('app_login');}}