<?php
namespace App\Controller;
use App\Form\ForgottenPasswordType;
use App\Form\ResetPasswordType;
use App\Repository\UserRepository;
use App\Service\ForgottenPassword;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
class SecurityController extends AbstractController
{
#[Route(path: '/login', name: 'login')]
public function login(
AuthenticationUtils $authenticationUtils
): Response
{
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
return $this->render('security/login.html.twig', ['last_username' => $lastUsername, 'error' => $error]);
}
#[Route(path: '/logout', name: 'logout')]
public function logout(): void
{
}
/**
* @
* @param Request $request
* @param UserRepository $userRepository
* @param EntityManagerInterface $em
* @param ForgottenPassword $forgottenPassword
* @param MailerInterface $mailer
* @return Response
*/
#[Route(path: '/forgotten-password', name: 'forgotten_password')]
public function forgottenPasswordEmail(Request $request, UserRepository $userRepository, EntityManagerInterface $em, ForgottenPassword $forgottenPassword, MailerInterface $mailer): Response
{
$form = $this->createForm(ForgottenPasswordType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid() && $form->get('email')->getData()) {
$user = $userRepository->findOneBy(['email' => $form->get('email')->getData()]);
if($user){
$user->setResetPassword(ForgottenPassword::generateToken());
$forgottenPassword->sendMail(
$mailer,
$user,
'Mot de passe oublié',
"emails/forgottenPassword.html.twig",
['user' => $user]
);
$em->flush();
$this->addFlash('success', 'Email envoyé!');
return $this->redirectToRoute('login');
}else{
$this->addFlash('error', 'Aucun utilisateur ne possède cet email!');
return $this->redirectToRoute('forgotten_password');
}
}
return $this->render('security/forgottenPassword.html.twig',[
'form' => $form->createView()
]);
}
/**
* @param string $token
* @param UserRepository $userRepository
* @param UserPasswordHasherInterface $passwordHasher
* @param EntityManagerInterface $em
* @param ForgottenPassword $forgottenPassword
* @param MailerInterface $mailer
* @param Request $request
* @return Response
*/
#[Route(path: '/reset-password/{token}', name: 'reset_password', methods: ["POST", "GET"])]
public function editPassword(string $token, UserRepository $userRepository, UserPasswordHasherInterface $passwordHasher, EntityManagerInterface $em, ForgottenPassword $forgottenPassword, MailerInterface $mailer, Request $request): Response
{
$user = $userRepository->findOneBy(['resetPassword' => $token]);
if(!$user){
$this->redirectToRoute('login');
}
$form = $this->createForm(ResetPasswordType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$user->setResetPassword(null);
$forgottenPassword->sendMail(
$mailer,
$user,
'Réinitialisation du mot de passe',
"emails/resetPassword.html.twig",
['user' => $user,]
);
$hashedPassword = $passwordHasher->hashPassword(
$user,
$form->get('password')->getData()
);
$user->setPassword($hashedPassword);
$em->flush();
$this->addFlash('success', 'Email envoyé!');
return $this->redirectToRoute('login');
}
return $this->render('security/resetPassword.html.twig',[
'form' => $form->createView()
]);
}
}