<?php
namespace App\Controller;
use App\Form\ResetUserPasswordType;
use FOS\UserBundle\Mailer\MailerInterface;
use FOS\UserBundle\Model\UserManagerInterface;
use FOS\UserBundle\Util\TokenGeneratorInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
/**
*
* @final
*/
class ResetPasswordController extends AbstractController
{
public function __construct(private UserManagerInterface $userManager, private TokenGeneratorInterface $tokenGenerator, private MailerInterface $mailer) {}
/**
* @Route("request", name="reset_password_request")
*
* @return Response
*/
public function resetPasswordRequest(): Response
{
return $this->render('user/password/reset_request.html.twig');
}
/**
* @Route("send/email", name="reset_password_send_email")
*
* @return Response
*/
public function sendEmailAction(Request $request): Response
{
$username = $request->request->get('username');
$user = $this->userManager->findUserByUsernameOrEmail($username);
if (!is_null($user)) {
$user->setConfirmationToken($this->tokenGenerator->generateToken());
$user->setPasswordRequestedAt(new \DateTime());
$this->userManager->updateUser($user);
$this->mailer->sendResettingEmailMessage($user);
}
return new RedirectResponse($this->generateUrl('reset_password_check_email'));
}
/**
* @Route("check/email", name="reset_password_check_email")
*
* @return Response
*/
public function checkEmailAction(Request $request): Response
{
return $this->render('user/password/check_email.html.twig',
[
'tokenValidity' => ceil($this->getParameter('reset_password_token_duration') / 3600),
]);
}
/**
* @Route("new/{token}", name="reset_password_new")
*
* @param string $token
*/
public function resetAction(Request $request, $token): Response
{
$user = $this->userManager->findUserByConfirmationToken($token);
if (is_null($user)) {
return new RedirectResponse($this->container->get('router')->generate('fos_user_security_login'));
}
if (!$user->isPasswordRequestNonExpired($this->getParameter('reset_password_token_duration')))
{
return new RedirectResponse($this->generateUrl('reset_password_expired'));
}
$form = $this->createForm(ResetUserPasswordType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$user->setConfirmationToken(null);
$this->userManager->updateUser($user);
$this->mailer->sendConfirmationEmailMessage($user);
return new RedirectResponse($this->generateUrl('reset_password_confirmation'));
}
return $this->render('user/password/new.html.twig', [
'token' => $token,
'form' => $form->createView(),
]);
}
/**
* @Route("confirmation", name="reset_password_confirmation")
*
* @return Response
*/
public function confirmationAction(): Response
{
return $this->render('user/password/confirmation.html.twig');
}
/**
* @Route("expired", name="reset_password_expired")
*
* @return Response
*/
public function expiredAction(): Response
{
return $this->render('user/password/expired.html.twig');
}
}