src/Controller/SecurityController.php line 35

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\User;
  4. use Doctrine\ORM\EntityManagerInterface;
  5. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Component\HttpFoundation\Response;
  8. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  9. use Symfony\Component\Routing\Annotation\Route;
  10. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  11. class SecurityController extends AbstractController
  12. {
  13. #[Route(path: '/login', name: 'app_login')]
  14. public function login(AuthenticationUtils $authenticationUtils): Response
  15. {
  16. $error = $authenticationUtils->getLastAuthenticationError();
  17. $lastUsername = $authenticationUtils->getLastUsername();
  18. return $this->render('security/login.html.twig', [
  19. 'last_username' => $lastUsername,
  20. 'error' => $error
  21. ]);
  22. }
  23. #[Route(path: '/logout', name: 'app_logout')]
  24. public function logout(): void
  25. {
  26. throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
  27. }
  28. #[Route(path: '/register', name: 'app_register')]
  29. public function register(Request $request, UserPasswordHasherInterface $userPasswordHasher, EntityManagerInterface $entityManager, \App\Service\TurnstileService $turnstileService): Response
  30. {
  31. $error = null;
  32. if ($request->isMethod('POST')) {
  33. $firstName = $request->request->get('firstName');
  34. $lastName = $request->request->get('lastName');
  35. $email = $request->request->get('email');
  36. $password = $request->request->get('password');
  37. $passwordConfirm = $request->request->get('passwordConfirm');
  38. $turnstileToken = $request->request->get('cf-turnstile-response', '');
  39. if (!$turnstileService->verify($turnstileToken, $request->getClientIp())) {
  40. $error = 'Security check failed. Please try again.';
  41. } elseif ($password !== $passwordConfirm) {
  42. $error = 'Passwords do not match.';
  43. } else {
  44. $existingUser = $entityManager->getRepository(User::class)->findOneBy(['email' => $email]);
  45. if ($existingUser) {
  46. $error = 'An account with this email already exists.';
  47. } else {
  48. $user = new User();
  49. $user->setFirstName($firstName);
  50. $user->setLastName($lastName);
  51. $user->setEmail($email);
  52. $user->setPassword(
  53. $userPasswordHasher->hashPassword(
  54. $user,
  55. $password
  56. )
  57. );
  58. $entityManager->persist($user);
  59. $entityManager->flush();
  60. // Optional: automatically log them in or redirect to login.
  61. return $this->redirectToRoute('app_login');
  62. }
  63. }
  64. }
  65. return $this->render('security/register.html.twig', [
  66. 'error' => $error,
  67. ]);
  68. }
  69. #[Route(path: '/settings', name: 'app_user_settings')]
  70. public function settings(Request $request, EntityManagerInterface $entityManager, UserPasswordHasherInterface $userPasswordHasher): Response
  71. {
  72. /** @var \App\Entity\User|null $user */
  73. $user = $this->getUser();
  74. if (!$user) {
  75. return $this->redirectToRoute('app_login');
  76. }
  77. $success = null;
  78. $error = null;
  79. if ($request->isMethod('POST')) {
  80. $firstName = $request->request->get('firstName');
  81. $lastName = $request->request->get('lastName');
  82. $newPassword = $request->request->get('newPassword');
  83. if ($firstName) $user->setFirstName($firstName);
  84. if ($lastName) $user->setLastName($lastName);
  85. if ($newPassword) {
  86. $user->setPassword(
  87. $userPasswordHasher->hashPassword(
  88. $user,
  89. $newPassword
  90. )
  91. );
  92. }
  93. $entityManager->persist($user);
  94. $entityManager->flush();
  95. $success = 'Settings updated successfully.';
  96. }
  97. return $this->render('security/settings.html.twig', [
  98. 'user' => $user,
  99. 'success' => $success,
  100. 'error' => $error
  101. ]);
  102. }
  103. }