src/FMT/Application/Controller/Common/ResetController.php line 149

Open in your IDE?
  1. <?php
  2. namespace FMT\Application\Controller\Common;
  3. use FMT\Data\Entity\User;
  4. use FMT\Application\FormType\Security\UserPasswordType;
  5. use FMT\Application\Traits\ControllerHelperTrait;
  6. use FMT\Domain\Service\Manager\UserManager;
  7. use FOS\UserBundle\Event\FilterUserResponseEvent;
  8. use FOS\UserBundle\Event\GetResponseUserEvent;
  9. use FOS\UserBundle\Form\Factory\FactoryInterface;
  10. use FOS\UserBundle\FOSUserEvents;
  11. use FOS\UserBundle\Mailer\MailerInterface;
  12. use FOS\UserBundle\Model\UserManagerInterface;
  13. use FOS\UserBundle\Util\TokenGeneratorInterface;
  14. use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
  15. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
  16. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
  17. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  18. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  19. use Symfony\Component\HttpFoundation\JsonResponse;
  20. use Symfony\Component\HttpFoundation\RedirectResponse;
  21. use Symfony\Component\HttpFoundation\Request;
  22. use FOS\UserBundle\Controller\ResettingController as FOSBaseController;
  23. use Symfony\Component\HttpFoundation\Response;
  24. use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface;
  25. use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
  26. /**
  27.  * Class ResetController
  28.  * @package FMT\Application\Controller
  29.  * @Route("/resetting")
  30.  * @Template()
  31.  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  32.  */
  33. class ResetController extends FOSBaseController
  34. {
  35.     use ControllerHelperTrait;
  36.     const ROUTE_RESET 'fmt-reset-reset';
  37.     const ROUTE_SEND_EMAIL 'fmt-reset-send-email';
  38.     const ROUTE_CHECK_EMAIL 'fmt-reset-check-email';
  39.     const ROUTE_REQUEST 'fmt-reset-request';
  40.     /**
  41.      * @var EventDispatcherInterface $eventDispatcher
  42.      */
  43.     private $eventDispatcher;
  44.     private FlashBagInterface $flashBag;
  45.     public function __construct(
  46.         EventDispatcherInterface $eventDispatcher,
  47.         FactoryInterface $formFactory,
  48.         UserManagerInterface $userManager,
  49.         TokenGeneratorInterface $tokenGenerator,
  50.         MailerInterface $mailer,
  51.         $retryTtl,
  52.         FlashBagInterface $flashBag
  53.     ) {
  54.         $this->flashBag $flashBag;
  55.         parent::__construct($eventDispatcher$formFactory$userManager$tokenGenerator$mailer$retryTtl);
  56.     }
  57.     /**
  58.      * @required
  59.      *
  60.      * @param EventDispatcherInterface $eventDispatcher
  61.      */
  62.     public function setEventDispatcher(EventDispatcherInterface $eventDispatcher)
  63.     {
  64.         $this->eventDispatcher $eventDispatcher;
  65.     }
  66.     /** @var UserManagerInterface */
  67.     private $manager;
  68.     /**
  69.      * @required
  70.      *
  71.      * @param UserManagerInterface $manager
  72.      */
  73.     public function setUserManager(UserManager $manager)
  74.     {
  75.         $this->manager $manager;
  76.     }
  77.     /**
  78.      * @return \Symfony\Component\HttpFoundation\Response
  79.      * @Route("/request", name=ResetController::ROUTE_REQUEST)
  80.      */
  81.     public function requestAction(): Response
  82.     {
  83.         return $this->render('@FOSUser/Resetting/request.html.twig');
  84.     }
  85.     /**
  86.      * @param Request $request
  87.      * @param $token
  88.      * @param User $user
  89.      * @return null|RedirectResponse|\Symfony\Component\HttpFoundation\Response
  90.      * @Route("/reset/{token}", name=ResetController::ROUTE_RESET)
  91.      * @ParamConverter("user", class="FMT\Data\Entity\User", options={
  92.      *     "repository_method" = "findUserByConfirmationToken",
  93.      *     "mapping": {"token": "token"},
  94.      *     "map_method_signature" = true
  95.      * })
  96.      */
  97.     public function resetPasswordAction(Request $request$tokenUser $user)
  98.     {
  99.         $event = new GetResponseUserEvent($user$request);
  100.         $this->eventDispatcher->dispatch($eventFOSUserEvents::RESETTING_RESET_INITIALIZE);
  101.         if (null !== $event->getResponse()) {
  102.             return $event->getResponse();
  103.         }
  104.         $form $this->createForm(UserPasswordType::class, $user);
  105.         $form->handleRequest($request);
  106.         if ($form->isSubmitted() && $form->isValid()) {
  107.             $this->manager->update($usertrue);
  108.             if (null === $response $event->getResponse()) {
  109.                 //TODO change this route if needed
  110.                 $url $this->generateUrl(PublicDashboardController::ROUTE_INDEX);
  111.                 $response = new RedirectResponse($url);
  112.             }
  113.             $this->eventDispatcher->dispatch(
  114.                 new FilterUserResponseEvent($user$request$response),
  115.                 FOSUserEvents::RESETTING_RESET_COMPLETED
  116.             );
  117.             return $response;
  118.         }
  119.         return $this->render('@FOSUser/Resetting/reset.html.twig', [
  120.             'token' => $token,
  121.             'form' => $form->createView(),
  122.             'email' => $user->getEmail(),
  123.         ]);
  124.     }
  125.     /**
  126.      * @param Request $request
  127.      * @return JsonResponse
  128.      * @Route("/send-email", name=ResetController::ROUTE_SEND_EMAIL)
  129.      */
  130.     public function sendEmailAction(Request $request): Response
  131.     {
  132.         if (!$request->isXmlHttpRequest()) {
  133.             throw new AccessDeniedHttpException('Incorrect request');
  134.         }
  135.         $email $request->get('username');
  136.         $user $this->manager->getUserByEmail($email);
  137.         if (!$user instanceof User) {
  138.             return $this->prepareJsonResponse(
  139.                 [
  140.                     'formError' => true,
  141.                     'email' => $email,
  142.                 ],
  143.                 '@Public/common/login/_reset_form_input.htm.twig',
  144.                 false
  145.             );
  146.         }
  147.         /**
  148.          * @var $redirect RedirectResponse
  149.          */
  150.         $redirect parent::sendEmailAction($request);
  151.         $redirect $redirect->getTargetUrl();
  152.         $flashBag $this->flashBag;
  153.         $flashBag->add('success''fmt.registration.reset.success_reset');
  154.         return $this->prepareJsonResponse(
  155.             ['email' => $email],
  156.             '@Public/common/login/_reset_form_input.htm.twig',
  157.             true,
  158.             $redirect
  159.         );
  160.     }
  161.     /**
  162.      * @param Request $request
  163.      * @return Response
  164.      * @Route("/check-email", name=ResetController::ROUTE_CHECK_EMAIL)
  165.      * @Security("not is_granted('ROLE_USER')")
  166.      */
  167.     public function checkEmailAction(Request $request): Response
  168.     {
  169.         return parent::checkEmailAction($request);
  170.     }
  171. }