<?php
namespace App\Controller;
use App\Classe\Mail;
use App\Repository\UserRepository;
use App\Form\ResetPasswordFormType;
use App\Form\ForgotPasswordFormType;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
class ForgotPasswordController extends AbstractController
{
private $en;
public function __construct(EntityManagerInterface $entityManager)
{
$this->en = $entityManager;
}
/**
* @Route("/mot-de-passe-oublie", name="app_password")
*/
public function index(Request $request, UserRepository $userRepository): Response
{
// 1. Création du formulaire
$form = $this->createForm(ForgotPasswordFormType::class);
$form->handleRequest($request);
// 2. Traitement du formulaire
if ($form->isSubmitted() && $form->isValid()) {
// 3. Récupération des données
$email = $form->get('email')->getData();
$user = $userRepository->findOneByEmail($email);
// 5. Si l'utilisateur existe, on envoie l'email
if ($user) {
$token = bin2hex(random_bytes(15));
$user->setToken($token);
$date = new \DateTime();
$date->modify('+ 10 minutes');
$user->setTokenExpireAt($date);
$this->en->persist($user);
$this->en->flush();
$url = $this->generateUrl('app_password_update', ['token' => $token], UrlGeneratorInterface::ABSOLUTE_URL);
$mail = new Mail();
$vars = ['link' => $url];
$mail->send(
$user->getEmail(),
$user->getFirstname().' '.$user->getLastName(),
'Modification de votre mot de passe - OKS-shop',
'forgotPassword.html',
$vars
);
}
}
return $this->render('password/index.html.twig', [
'forgotPasswordForm' => $form->createView(),
]);
}
/**
* @Route("/mot-de-passe/reset/{token}", name="app_password_update")
*/
public function update(Request $request, UserRepository $userRepository, $token): Response
{
if (!$token) {
return $this->redirectToRoute('app_password');
}
$user = $userRepository->findOneByToken($token);
$now = new \DateTime();
if (!$user || $user->getTokenExpireAt() < $now) {
return $this->redirectToRoute('app_password');
}
$form = $this->createForm(ResetPasswordFormType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$user->setToken(null);
$user->setTokenExpireAt(null);
$this->en->flush();
$this->addFlash(
'success',
'Votre mot de passe a bien été modifié !'
);
return $this->redirectToRoute('app_login');
}
return $this->render('password/reset.html.twig', [
'form' => $form->createView(),
]);
}
}