src/Controller/RegistrationController.php line 43

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\User;
  4. use App\Form\RegistrationFormType;
  5. use App\Repository\UserRepository;
  6. use App\Security\UserAuthenticator;
  7. use App\Services\SendMail;
  8. use App\Services\UploadRccm;
  9. use DateTime;
  10. use Doctrine\ORM\EntityManagerInterface;
  11. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  12. use Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException;
  13. use Symfony\Component\HttpFoundation\File\Exception\FileException;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\HttpFoundation\Response;
  16. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  17. use Symfony\Component\Routing\Annotation\Route;
  18. use Symfony\Component\Security\Core\Exception\AccessDeniedException as ExceptionAccessDeniedException;
  19. use Symfony\Component\Security\Csrf\TokenGenerator\TokenGeneratorInterface;
  20. use Symfony\Component\Security\Http\Authentication\UserAuthenticatorInterface;
  21. use Symfony\Component\Security\Http\RememberMe\ResponseListener;
  22. use Symfony\Component\String\Slugger\SluggerInterface;
  23. use Symfony\Contracts\Translation\TranslatorInterface;
  24. class RegistrationController extends AbstractController
  25. {
  26.     #[Route('/enregistrement'name'app_register')]
  27.     /**
  28.      * Cette fonction fait l'enrégistrement d'un compte utilisateur
  29.      * On génère un token pour chaque compte en fin qu'on puisse faire la confirmation du compte
  30.      * Si la création du compte est faite on envoie un email à l'utilisateur
  31.      *
  32.      * @param Request $request
  33.      * @param UserPasswordHasherInterface $userPasswordHasher
  34.      * @param EntityManagerInterface $entityManager
  35.      * @param SendMail $sendMail
  36.      * @param TokenGeneratorInterface $tokenGeneratorInterface
  37.      * @param SluggerInterface $slugger
  38.      * @return Response
  39.      */
  40.     public function register(
  41.         Request                     $request,
  42.         UserPasswordHasherInterface $userPasswordHasher,
  43.         EntityManagerInterface      $entityManager,
  44.         SendMail                    $sendMail,
  45.         TokenGeneratorInterface     $tokenGeneratorInterface,
  46.         SluggerInterface            $slugger
  47.     ): Response {
  48.         $user = new User();
  49.         $form $this->createForm(RegistrationFormType::class, $user);
  50.         $form->handleRequest($request);
  51.         if ($form->isSubmitted() && $form->isValid()) {
  52.             #recupération du rccm et l'enregistrment
  53.             $fichier $form->get('rccm')->getData();
  54.             if ($fichier) {
  55.                 $nomOrigine pathinfo($fichier->getClientOriginalName(), PATHINFO_FILENAME);
  56.                 $safeFilename $slugger->slug($nomOrigine);
  57.                 $nouveauNom $safeFilename '-' uniqid() . '.' $fichier->guessExtension();
  58.                 try {
  59.                     $fichier->move(
  60.                         $this->getParameter('pdf_directory'),
  61.                         $nouveauNom
  62.                     );
  63.                 } catch (FileException $e) {
  64.                 }
  65.                 $user->setRccmFileName($nouveauNom);
  66.             }
  67.             //création du token
  68.             $tokenRegistration $tokenGeneratorInterface->generateToken();
  69.             //utilisateur
  70.             $user->setRoles(['ROLE_USER']);
  71.             $user->setProfil('client');
  72.             $user->setPassword(
  73.                 $userPasswordHasher->hashPassword(
  74.                     $user,
  75.                     $form->get('password')->getData()
  76.                 )
  77.             );
  78.             //User token
  79.             $user->setTokenRegistration($tokenRegistration);
  80.             $entityManager->persist($user);
  81.             $entityManager->flush();
  82.             //envoi d'email
  83.             $sendMail->sendMail(
  84.                 $user->getEmail(),
  85.                 'Confirmation du compte utilisateur',
  86.                 'registration_confirmation.html.twig',
  87.                 [
  88.                     'user' => $user,
  89.                     'token' => $tokenRegistration,
  90.                     'lifeTimeToken' => $user->getTokenRegistrationLifeTime()->format('d/m/Y'),
  91.                 ]
  92.             );
  93.             $this->addFlash('success''Votre compte à été créé, veuillez vérifier votre mail pour l\'activer.');
  94.             return $this->redirectToRoute('app_login');
  95.         }
  96.         return $this->render('registration/inscription.html.twig', [
  97.             'registrationForm' => $form->createView(),
  98.         ]);
  99.     }
  100.     #[Route('/verify/{token}/{id}'name'account_verify'methods: ['GET'])]
  101.     /**
  102.      * Cette fonction fait la vérification du compte Utilisateur
  103.      *
  104.      * @param [type] $token
  105.      * @param [type] $id
  106.      * @param EntityManagerInterface $em
  107.      * @param UserRepository $userRepository
  108.      * @return Response
  109.      */
  110.     public function verifyCompte($token$idEntityManagerInterface $emUserRepository $userRepository): Response
  111.     {
  112.         /** @var User */
  113.         $user = new User();
  114.         $user $userRepository->find($id);
  115.         /* On vérifie si le token est différent du token courent
  116.         si c'est différent on lève une exception */
  117.         if ($user->getTokenRegistration() !== $token) {
  118.             throw new ExceptionAccessDeniedException();
  119.         }
  120.         /* On vérifie si le token est égal à null
  121.         si c'est égale on lève une exception */
  122.         if ($user->getTokenRegistration() === null) {
  123.             throw new ExceptionAccessDeniedException();
  124.         }
  125.         /* On vérifie si la date de géneration du token est strictement inférieure à la date de l'instant présent
  126.             Si c'est strictement inférerieur on lève une exception
  127.         */
  128.         if (new DateTime('now') > $user->getTokenRegistrationLifeTime()) {
  129.             throw new ExceptionAccessDeniedException();
  130.         }
  131.         /* Si aucune de ces conditions n'est vérifiée on modifie la bd
  132.         pour activer le compte */
  133.         $user->setIsVerified(true);
  134.         $user->setTokenRegistration(null);
  135.         $em->flush();
  136.         $this->addFlash("success"'Votre compte a été activé veuillez vous connecter à présent');
  137.         return $this->redirectToRoute('app_login');
  138.     }
  139. }