src/Controller/AccountController.php line 133

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Services\SetPasswordService;
  4. use Pimcore\Controller\FrontendController;
  5. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  8. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  9. use Symfony\Component\Routing\Annotation\Route;
  10. use CustomerManagementFrameworkBundle\CustomerProvider\CustomerProviderInterface;
  11. use CustomerManagementFrameworkBundle\CustomerSaveValidator\Exception\DuplicateCustomerException;
  12. use CustomerManagementFrameworkBundle\Security\Authentication\LoginManagerInterface;
  13. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  14. use Symfony\Component\Security\Core\User\UserInterface;
  15. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  16. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
  17. use App\Model\DataObject\Customer;
  18. use App\Services\PasswordRecoveryService;
  19. use Pimcore\Translation\Translator;
  20. #use Pimcore\Model\DataObject\Customer;
  21. use App\Form\RegistrationFormHandler;
  22. use App\Form\RegistrationFormType;
  23. use App\Form\LoginFormType;
  24. class AccountController extends FrontendController
  25. {
  26.     /**
  27.      * @Template
  28.      *
  29.      * @param Request $request
  30.      * @param CustomerProviderInterface $customerProvider
  31.      * @param RegistrationFormHandler $registrationFormHandler
  32.      * @param RegistrationFormType $registrationFormType
  33.      *
  34.      * @return array
  35.      */
  36.     public function registerAction(
  37.         Request $request,
  38.         CustomerProviderInterface $customerProvider,
  39.         LoginManagerInterface $loginManager,
  40.         RegistrationFormHandler $registrationFormHandler,
  41.     ) {
  42.         $errors = [];
  43.         $success = false;
  44.         $customer = $customerProvider->create();
  45.         $formData = $registrationFormHandler->buildFormData($customer);
  46.         $form = $this->createForm(RegistrationFormType::class, $formData, ['hidePassword' => false]);
  47.         $form->handleRequest($request);
  48.         // Try to create user from valid submitted form
  49.         if ($form->isSubmitted() && $form->isValid()) {
  50.             $fields = $form->getData();
  51.             $registrationFormHandler->updateCustomerFromForm($customer, $form);
  52.             $customer->setActive(true);
  53.             try {
  54.                 $customer->save();
  55.                 $success = true;
  56.             } catch (DuplicateCustomerException $e) {
  57.                 // FIXME: error melding met link naar pass reset pagina
  58.                 $errors[] = 'Er bestaat al een account op dit e-mailadres'; /*$translator->trans(
  59.                     'account.customer-already-exists',
  60.                     [
  61.                         $customer->getEmail(),
  62.                         $urlGenerator->generate('account-password-send-recovery', ['email' => $customer->getEmail()])
  63.                     ]
  64.                 );*/
  65.             } catch (\Exception $e) {
  66.                 $errors[] = $e->getMessage();
  67.             }
  68.         }
  69.         // Return errors if form is invalid
  70.         if ($form->isSubmitted() && !$form->isValid()) {
  71.             foreach ($form->getErrors() as $error) {
  72.                 $errors[] = $error->getMessage();
  73.             }
  74.         }
  75.         // Just return the template if it is specified
  76.         return $this->render('register.html.twig', [
  77.             'form' => $form->createView(),
  78.             'success' => $success,
  79.             'errors' => $errors
  80.         ]);
  81.     }
  82.     /**
  83.      * @Route("/account/login", name="account-login")
  84.      *
  85.      * @param AuthenticationUtils $authenticationUtils
  86.      * @param Request $request
  87.      * @param UserInterface|null $user
  88.      *
  89.      * @return Response|RedirectResponse
  90.      */
  91.     public function loginAction(
  92.         AuthenticationUtils $authenticationUtils,
  93.         Request $request,
  94.         UserInterface $user = null
  95.     ) {
  96.         //redirect user to index page if logged in
  97.         if ($user && $this->isGranted('ROLE_USER')) {
  98.             return $this->redirectToRoute('account-index');
  99.         }
  100.         // get the login error if there is one
  101.         $error = $authenticationUtils->getLastAuthenticationError();
  102.         // last username entered by the user
  103.         $lastUsername = $authenticationUtils->getLastUsername();
  104.         $formData = [
  105.             '_username' => $lastUsername
  106.         ];
  107.         $form = $this->createForm(LoginFormType::class, $formData, [
  108.             'action' => $this->generateUrl('account-login'),
  109.         ]);
  110.         //store referer in session to get redirected after login
  111.         if (!$request->get('no-referer-redirect')) {
  112.             $request->getSession()->set('_security.main.target_path', $request->headers->get('referer'));
  113.         }
  114.         return $this->render('login.html.twig', [
  115.             'form' => $form->createView(),
  116.             'error' => $error,
  117.             'hideBreadcrumbs' => true
  118.         ]);
  119.     }
  120.     /**
  121.      * @Route("/account/send-password-recovery", name="account-password-send-recovery")
  122.      *
  123.      * @param Request $request
  124.      * @param PasswordRecoveryService $service
  125.      * @param Translator $translator
  126.      *
  127.      * @return Response
  128.      *
  129.      * @throws \Exception
  130.      */
  131.     public function sendPasswordRecoveryMailAction(Request $request, PasswordRecoveryService $service, Translator $translator)
  132.     {
  133.         if ($request->isMethod(Request::METHOD_POST)) {
  134.             try {
  135.                 $customer = $service->sendRecoveryMail($request->get('email', ''), $this->document->getProperty('password_reset_mail'));
  136.                 if (!$customer instanceof Customer) {
  137.                     throw new \Exception('Invalid Customer');
  138.                 }
  139.                 $this->addFlash('success', $translator->trans('account.reset-mail-sent-when-possible'));
  140.             } catch (\Exception $e) {
  141.                 $this->addFlash('danger', $e->getMessage());
  142.             }
  143.             return $this->redirectToRoute('account-login', ['no-referer-redirect' => true]);
  144.         }
  145.         return $this->render('account/send_password_recovery_mail.html.twig', [
  146.             'emailPrefill' => $request->get('email')
  147.         ]);
  148.     }
  149.     /**
  150.      * @Route("/account/reset-password", name="account-reset-password")
  151.      *
  152.      * @param Request $request
  153.      * @param PasswordRecoveryService $service
  154.      * @param Translator $translator
  155.      *
  156.      * @return Response|RedirectResponse
  157.      */
  158.     public function resetPasswordAction(Request $request, PasswordRecoveryService $service, Translator $translator)
  159.     {
  160.         $token = $request->get('token');
  161.         $customer = $service->getCustomerByToken($token);
  162.         $error = '';
  163.         if (!$customer) {
  164.             //TODO render error page
  165.             throw new NotFoundHttpException('Invalid token');
  166.         }
  167.         if ($request->isMethod(Request::METHOD_POST)) {
  168.             $newPassword = $request->get('password');
  169.             if (strlen($newPassword) < 8){
  170.                 $error = $translator->trans('account.password-length-error');
  171.                 return $this->render('account/reset_password.html.twig', [
  172.                     'hideBreadcrumbs' => true,
  173.                     'token' => $token,
  174.                     'email' => $customer->getEmail(),
  175.                     'error' => $error
  176.                 ]);
  177.             }
  178.             $service->setPassword($token, $newPassword);
  179.             $this->addFlash('success', $translator->trans('account.password-reset-successful'));
  180.             return $this->redirectToRoute('account-login', ['no-referer-redirect' => true]);
  181.         }
  182.         return $this->render('account/reset_password.html.twig', [
  183.             'hideBreadcrumbs' => true,
  184.             'token' => $token,
  185.             'email' => $customer->getEmail(),
  186.             'error' => $error
  187.         ]);
  188.     }
  189.     /**
  190.      * @Route("/account/set-password", name="account-set-password")
  191.      *
  192.      * @param Request $request
  193.      * @param SetPasswordService $service
  194.      * @param Translator $translator
  195.      *
  196.      * @return Response|RedirectResponse
  197.      */
  198.     public function setPasswordAction(Request $request, SetPasswordService $setPasswordService, Translator $translator)
  199.     {
  200.         $token = $request->get('token');
  201.         $customer = $setPasswordService->getCustomerByToken($token);
  202.         $error = '';
  203.         if (!$customer) {
  204.             //TODO render error page
  205.             throw new NotFoundHttpException('Invalid token');
  206.         }
  207.         if ($request->isMethod(Request::METHOD_POST)){
  208.             $newPassword = $request->get('password');
  209.             if (strlen($newPassword) < 8){
  210.                 $error = $translator->trans('account.password-length-error');
  211.                 return $this->render('account/set_password.html.twig', [
  212.                     'hideBreadcrumbs' => true,
  213.                     'token' => $token,
  214.                     'email' => $customer->getEmail(),
  215.                     'error' => $error
  216.                 ]);
  217.             }
  218.             $setPasswordService->setPassword($token, $newPassword);
  219.             return $this->redirectToRoute('account-login', ['no-referer-redirect' => true]);
  220.         }
  221.         return $this->render('account/set_password.html.twig', [
  222.             'hideBreadcrumbs' => true,
  223.             'token' => $token,
  224.             'email' => $customer->getEmail(),
  225.             'error' => $error
  226.         ]);
  227.     }
  228.     /**
  229.      * @Route("/account/change-password", name="account-change-password")
  230.      * @Security("is_granted('ROLE_USER')")
  231.      * @param Request $request
  232.      * @return void
  233.      */
  234.     public function changePasswordAction(Request $request, SetPasswordService $setPasswordService, Translator $translator)
  235.     {
  236.         $user = $this->getUser();
  237.         $error = '';
  238.         if ($request->isMethod(Request::METHOD_POST)){
  239.             $newPassword = $request->get('password');
  240.             if (strlen($newPassword) < 8){
  241.                 $error = $translator->trans('account.password-length-error');
  242.                 return $this->render('account/change_password.html.twig', [
  243.                     'hideBreadcrumbs' => true,
  244.                     'error' => $error
  245.                 ]);
  246.             }
  247.             $setPasswordService->changePassword($user, $newPassword);
  248.             return $this->redirectToRoute('account-index', ['no-referer-redirect' => true]);
  249.         }
  250.         return $this->render('account/change_password.html.twig', [
  251.             'hideBreadcrumbs' => true,
  252.             'error' => $error
  253.         ]);
  254.     }
  255. }