<?php
namespace App\Controller\Security;
use App\Entity\User;
use App\Repository\UserRepository;
use App\Service\EmailService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Uid\Uuid;
/**
* @Route("/passwort-zuruecksetzen")
*/
class ResetPasswordController extends AbstractController {
/** @var EntityManagerInterface */
private $entityManager;
/** @var UserRepository */
private $userRepository;
/**
* @var EmailService
*/
private $emailService;
public function __construct(EntityManagerInterface $entityManager, UserRepository $userRepository, EmailService $emailService) {
$this->entityManager = $entityManager;
$this->userRepository = $userRepository;
$this->emailService = $emailService;
}
/**
* @Route("/anfrage", name="app_forgot_password_request")
*/
public function requestPasswordReset(Request $request): Response {
$form = $this->createFormBuilder()
->add('email', TextType::class, [
'label' => 'Deine E-Mail Adresse',
'attr' => [
'class' => 'border-accent form-control',
'placeholder' => 'Deine E-Mail Adresse',
],
])
->add('submit', SubmitType::class, [
'label' => 'Passwort zurücksetzen',
'attr' => [
'class' => 'button accent',
],
])
->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
/** @var array<string> */
$data = $form->getData();
/** @var User */
$user = $this->userRepository->findOneBy([
'email' => $data['email'],
]);
if ($user instanceof User) {
$user->setPasswordResetToken(Uuid::v6());
$user->setPasswordResetTokenValidity(new \DateTime('+1 hour'));
$this->entityManager->persist($user);
$this->entityManager->flush();
if ($user->getId()) {
$this->emailService->sendPasswordResetEmail($user->getId());
}
}
return $this->redirectToRoute('app_forgot_password_request_success');
}
return $this->render('security/reset_password/request.html.twig', [
'form' => $form->createView(),
]);
}
/**
* @Route("/anfrage/{token}", name="app_forgot_password_reset")
*/
public function passwordReset(Request $request, string $token, UserPasswordHasherInterface $passwordHasher): Response {
/** @var User */
$user = $this->userRepository->findOneBy([
'passwordResetToken' => $token,
]);
if (!$user instanceof User) {
return $this->redirectToRoute('app_forgot_password_reset_failed');
}
$form = $this->createFormBuilder()
->add('password', PasswordType::class, [
'label' => 'Neues Passwort',
])
->add('user', HiddenType::class, [
'data' => $user->getId(),
])
->add('submit', SubmitType::class, [
'label' => 'Passwort zurücksetzen',
'attr' => [
'class' => 'btn btn-primary',
],
])
->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
/** @var array<string> */
$data = $form->getData();
$user->setPassword(
$passwordHasher->hashPassword(
$user,
$data['password']
)
);
$user->setPasswordResetToken(null);
$user->setPasswordResetTokenValidity(null);
$this->entityManager->persist($user);
$this->entityManager->flush();
return $this->redirectToRoute('app_forgot_password_reset_success');
}
return $this->render('security/reset_password/reset.html.twig', [
'form' => $form->createView(),
]);
}
/**
* @Route("/anfrage-versendet", name="app_forgot_password_request_success")
*/
public function passwordResetRequestSuccess(): Response {
return $this->render('security/reset_password/request_success.html.twig');
}
/**
* @Route("/anfrage-fehlgeschlagen", name="app_forgot_password_failed")
*/
public function passwordResetRequestFailed(): Response {
return $this->render('security/reset_password/request_failed.html.twig');
}
/**
* @Route("/zueucksetzen-erfolgreich", name="app_forgot_password_reset_success")
*/
public function passwordResetSuccess(): Response {
return $this->render('security/reset_password/reset_success.html.twig');
}
/**
* @Route("/zueucksetzen-fehlgeschlagen", name="app_forgot_password_reset_failed")
*/
public function passwordResetFailed(): Response {
return $this->render('security/reset_password/reset_failed.html.twig');
}
}