src/Controller/RegisterController.php line 39

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Doctor;
  4. use App\Entity\DoctorInterface;
  5. use App\Entity\Patient;
  6. use App\Event\MemberRegisteredEvent;
  7. use App\Events;
  8. use App\Exception\AppException;
  9. use App\Form\CreatePasswordType;
  10. use App\Form\RegisterType;
  11. use App\Security\EmailVerifier;
  12. use Boab\CmsBundle\Controller\BaseController;
  13. use Boab\CmsBundle\Entity\UserInterface;
  14. use Boab\CmsBundle\Exception\ApiException;
  15. use Boab\CmsBundle\Repository\UserRepository;
  16. use Boab\CmsBundle\Repository\UserRepositoryInterface;
  17. use Boab\CmsBundle\Security\RandomGeneratorInterface;
  18. use Boab\CmsBundle\View\ViewManagerInterface;
  19. use Doctrine\Common\Cache\Psr6\InvalidArgument;
  20. use Psr\Log\LoggerInterface;
  21. use Symfony\Component\HttpFoundation\JsonResponse;
  22. use Symfony\Component\HttpFoundation\Request;
  23. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  24. use Symfony\Component\Routing\Annotation\Route;
  25. use SymfonyCasts\Bundle\VerifyEmail\Exception\VerifyEmailExceptionInterface;
  26. class RegisterController extends BaseController
  27. {
  28.     public function __construct(
  29.         private RandomGeneratorInterface $generator
  30.         private UserPasswordHasherInterface $passwordHasher
  31.         private LoggerInterface $logger
  32.         private EmailVerifier $emailVerifier,
  33.         private UserRepositoryInterface $userRepository)
  34.     {}
  35.     
  36.     public function index(Request $requestViewManagerInterface $view,$_route)
  37.     {
  38.         $form $this->createForm(RegisterType::class, null,[
  39.             "action" => $this->router->generate($_route),
  40.             "method"=>'post'
  41.         ]);
  42.         $form->handleRequest($request);
  43.         if($form->isSubmitted() && $form->isValid()){
  44.             $data $form->getData();
  45.             $member $this->getUserEntity($data);
  46.             try{
  47.                 $this->entityManager->beginTransaction();
  48.                 $this->save($member);
  49.                 $event = new MemberRegisteredEvent($member);
  50.                 $this->eventDispatcher->dispatch($eventEvents::MEMBER_REGISTERED);
  51.                 $this->entityManager->commit();
  52.                 return $this->redirectToRoute('app.register_success', ['username'=>$member->getUsername()]);
  53.             }catch(\Exception $e){
  54.                 //dump($e);
  55.                 $this->logger->error($e->getMessage(), ['exception'=>$e]);
  56.                 $this->entityManager->rollback();
  57.                 $this->flash->setWarning('Something went wrong during procession of the form. Please try again.');
  58.             }
  59.             return $this->redirectToRoute($_route, ['username'=>$member->getUsername()]);
  60.         }elseif($form->isSubmitted() && !$form->isValid())      {
  61.             $this->flash->setWarning('Error! Please correct the errors on the form');
  62.         }
  63.         $view $view->load('app/sign_up.html.twig');
  64.         $view->form $form->createView();
  65.         $view->pageTitle "Register";
  66.         return $view
  67.     }
  68.     public function success(Request $requestViewManagerInterface $view$_route)
  69.     {
  70.         $username $request->get('username');
  71.         if(!$username){
  72.             throw new AppException(400'Invalid Request! The resource you are accessing is invalid');
  73.         }
  74.         $user $this->getUserByUsername($username);
  75.         //dump($user);
  76.         return $this->render('app/register_success.html.twig',[
  77.             'email' =>  $user->getEmail(),
  78.             'pageTitle' => "Thank you for registring"
  79.         ]);
  80.     }
  81.     /**
  82.      * @Route("/verify", name="app.verify_registration")
  83.      */
  84.     public function verify(Request $request)
  85.     {
  86.         $id $request->get('id');
  87.         $user $this->userRepository->findOneBy(['id'=>$id]);
  88.         if (!$user) {
  89.             throw new AppException(422'Invalid Request! Something went wrong and could not process your request');
  90.         }
  91.         // validate email confirmation link, sets User::isVerified=true and persists
  92.         try {
  93.             $this->emailVerifier->handleEmailConfirmation($request$user);
  94.             $user->setIsVerified(true);
  95.             $this->save($user);
  96.         } catch (VerifyEmailExceptionInterface \Exception $exception) {
  97.             throw new AppException(500$exception->getMessage());
  98.         }
  99.         // @TODO Change the redirect on success and handle or remove the flash message in your templates
  100.         
  101.         $this->flash->setWarning('success''Your email address has been verified.');
  102.         return $this->redirectToRoute('app.register_create_password', ['username'=>$user->getUsername()]);
  103.     }
  104.     /**
  105.      * @Route("/create-password/{username}", name="app.create_password")
  106.      */
  107.     public function password(Request $requestUserPasswordHasherInterface $passwordHasherstring $username)
  108.     {
  109.         $user $this->getUserByUsername($username);
  110.         $form $this->createForm(CreatePasswordType::class, null, [
  111.             'action' => $this->router->generate('app.register_create_password', ["username"=>$username]),
  112.             'method' => 'POST',
  113.         ]);
  114.         $form->handleRequest($request);
  115.         if($form->isSubmitted() && $form->isValid()) {
  116.             //$data = $form->getData();
  117.             $data $request->request->all()[$form->getName()];
  118.             try{
  119.                 $hashedPassword $passwordHasher->hashPassword($user$data['plainPassword']['first']);
  120.                 $user->setPassword($hashedPassword);
  121.                 $role $user instanceof DoctorInterface 'ROLE_DOCTOR':'ROLE_CLIENT';
  122.                 $user->addRole($role);
  123.                 $this->save($user);
  124.             }catch(\Exception $e){
  125.                 $this->logger->error($e->getMessage(), ['exception'=>$e]);
  126.                 throw new ApiException(500'Something went wrong with the data');
  127.             }
  128.             return new JsonResponse([
  129.                 'status'=>'success',
  130.                 'message' => 'Password updated successfully',
  131.                 'redirectUrl' => $this->router->generate('app.login')
  132.             ]);
  133.         } 
  134.         $view $this->viewManager->load('registration/password_form.html.twig');
  135.         $view->pageTitle 'Email Verification';
  136.         $view->user $user;
  137.         $view->form $form->createView();
  138.         
  139.         return $view;
  140.     }
  141.     private function getUserByUsername(string $username): UserInterface
  142.     {
  143.         $user $this->userRepository->findOneBy(['username'=>$username]);
  144.         if (!$user) {
  145.             throw new InvalidArgument('Invalid Request! Something went wrong and could not process your request');
  146.         }
  147.         return $user;        
  148.     }
  149.     private function getUserEntity(array $data)
  150.     {
  151.         $user $data['registerAs'] == 'Client' ? new Patient : new Doctor;
  152.         //$password = $this->passwordHasher->hashPassword($user, $data['password']);
  153.         $username $this->generator->generate(8);
  154.         $user->setFirstName($data['firstname'])
  155.             ->setLastName($data['lastname'])
  156.             ->setDob($data['dob'])
  157.             ->setEmail($data['email'])
  158.             ->setWhatsappNumber($data['whatsappNumber'])
  159.             ->setAddress($data['address'])
  160.             ->setCity($data['city'])
  161.             ->setCountry($data['country'])
  162.             ->setGender($data['gender'])
  163.             ->setContactNumber($data['contactNumber'])
  164.             ->setIsActivated(false)
  165.             ->setUsername($username)
  166.             ->setCreatedAt(new \DateTime('now'))
  167.             //->setPassword($password)
  168.             ->setLongitude($data['longitude'])
  169.             ->setLatitude($data['latitude'])
  170.         ;
  171.         if($user instanceof Doctor){
  172.             $user->setPricing('Free');
  173.             $user->addRole('ROLE_START_MEETING');
  174.         }
  175.         return $user;
  176.     }
  177. }