src/Controller/RegistrationController.php line 57

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\User;
  4. use App\Factory\Security\SecurityFormFactory;
  5. use App\Services\Back\GoogleService;
  6. use App\Services\Common\UserService;
  7. use App\Services\DTV\YamlConfig\YamlReader;
  8. use Exception;
  9. use Psr\Log\LoggerInterface;
  10. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  11. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\HttpFoundation\Response;
  14. use Symfony\Component\Routing\Annotation\Route;
  15. use Symfony\Component\Translation\TranslatableMessage;
  16. use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
  17. use Symfony\Contracts\HttpClient\HttpClientInterface;
  18. /**
  19. * Controller pour la gestion de l'inscription
  20. */
  21. class RegistrationController extends AbstractController
  22. {
  23. private SecurityFormFactory $formFactory;
  24. private YamlReader $yamlReader;
  25. private LoggerInterface $logger;
  26. private string $env;
  27. private HttpClientInterface $client;
  28. private ParameterBagInterface $params;
  29. private UserService $userService;
  30. public function __construct(
  31. SecurityFormFactory $formFactory,
  32. YamlReader $yamlReader,
  33. LoggerInterface $logger,
  34. string $env,
  35. HttpClientInterface $client,
  36. UserService $userService,
  37. ParameterBagInterface $params
  38. ) {
  39. $this->formFactory = $formFactory;
  40. $this->yamlReader = $yamlReader;
  41. $this->logger = $logger;
  42. $this->env = $env;
  43. $this->client = $client;
  44. $this->userService = $userService;
  45. $this->params = $params;
  46. }
  47. /**
  48. * Formulaire d'inscription
  49. *
  50. * @Route("/register", name="app_register")
  51. */
  52. public function register(Request $request): Response
  53. {
  54. $registerConfig = $this->yamlReader->getRegister();
  55. $user = $this->userService->initUser();
  56. try {
  57. $formRegister = $this->formFactory->generateRegisterForm($user);
  58. } catch (Exception $e) {
  59. throw $this->createNotFoundException($e->getMessage());
  60. }
  61. $formRegister->handleRequest($request);
  62. if ($formRegister->isSubmitted()) {
  63. if ($formRegister->has('captcha')) {
  64. $token = $formRegister->get('captcha')->getData();
  65. if (!$this->params->get('recaptcha_verify_url') || !$this->params->get('recaptcha_secret')) {
  66. throw new Exception('Incomplete recaptcha configuration: missing URL or secret in ENV');
  67. }
  68. $url = $this->params->get('recaptcha_verify_url');
  69. $data = [
  70. 'secret' => $this->params->get('recaptcha_secret'),
  71. 'response' => $token,
  72. ];
  73. $response = $this->client->request('POST', $url, [
  74. 'headers' => [
  75. 'Content-Type' => 'application/x-www-form-urlencoded',
  76. ],
  77. 'body' => $data,
  78. ]);
  79. if (!$response->toArray()['success']) {
  80. return $this->redirectToRoute('app_register');
  81. }
  82. }
  83. try {
  84. $formRegister = $this->formFactory->postValidateRegisterForm($formRegister);
  85. } catch (Exception $e) {
  86. if ($this->env === 'dev') {
  87. throw $e;
  88. }
  89. $this->addFlash(
  90. 'danger',
  91. new TranslatableMessage('impossible d\'exécuter la post validation du formulaire', [])
  92. );
  93. $referer = $request->headers->get('referer');
  94. if (!$referer) {
  95. return $this->redirectToRoute('app_register');
  96. }
  97. return $this->redirect($referer);
  98. }
  99. if ($formRegister->isValid()) {
  100. // Post traitement du formulaire d'inscription
  101. try {
  102. $response = $this->formFactory->postProcessingRegisterForm($formRegister, $user);
  103. } catch (Exception|TransportExceptionInterface $e) {
  104. if ($this->env === 'dev') {
  105. throw $e;
  106. }
  107. $this->logger->critical($e->getMessage());
  108. $this->addFlash(
  109. 'danger',
  110. 'impossible d\'exécuter le post traitement du formulaire :' . $e->getMessage()
  111. );
  112. $referer = $request->headers->get('referer');
  113. if (!$referer) {
  114. return $this->redirectToRoute('app_register');
  115. }
  116. return $this->redirect($referer);
  117. }
  118. if ($response['message'] !== null) {
  119. $this->addFlash(isset($response['type']) ? $response['type'] : 'success', $response['message']);
  120. }
  121. return $this->redirectToRoute($response['route']);
  122. }
  123. }
  124. $twigPath = 'registration/register.html.twig';
  125. if (isset($registerConfig['folder']) && !in_array($registerConfig['folder'], [null, false, ''], true)) {
  126. $twigPath = 'registration/' . $registerConfig['folder'] . '/register.html.twig';
  127. }
  128. return $this->render($twigPath, [
  129. 'registrationForm' => $formRegister->createView(),
  130. ]);
  131. }
  132. /**
  133. * Page d'attente de validation de l'inscription
  134. *
  135. * @Route("/register/waiting_validation", name="app_register_waiting_validation")
  136. *
  137. * @return Response
  138. */
  139. public function waitingRegisterValidation(): Response
  140. {
  141. return $this->render('registration/waiting_register_validation.html.twig');
  142. }
  143. }