src/Controller/RegistrationController.php line 67

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. }
  59. catch ( Exception $e ) {
  60. throw $this->createNotFoundException( $e->getMessage() );
  61. }
  62. $formRegister->handleRequest( $request );
  63. if ( $formRegister->isSubmitted() )
  64. {
  65. if($formRegister->has('captcha')){
  66. $token = $formRegister->get('captcha')->getData();
  67. if(!$this->params->get('recaptcha_verify_url')||!$this->params->get('recaptcha_secret')){
  68. throw new Exception('Incomplete recaptcha configuration: missing URL or secret in ENV');
  69. }
  70. $url = $this->params->get('recaptcha_verify_url');
  71. $data = [
  72. 'secret' => $this->params->get('recaptcha_secret'),
  73. 'response' => $token,
  74. ];
  75. $response = $this->client->request('POST', $url, [
  76. 'headers' => [
  77. 'Content-Type' => 'application/x-www-form-urlencoded',
  78. ],
  79. 'body' => $data,
  80. ]);
  81. if(!$response->toArray()['success']){
  82. return $this->redirectToRoute('app_register');
  83. }
  84. }
  85. try {
  86. $formRegister = $this->formFactory->postValidateRegisterForm( $formRegister );
  87. }
  88. catch ( Exception $e )
  89. {
  90. if($this->env === 'dev') throw $e;
  91. $this->addFlash( 'danger', new TranslatableMessage( 'impossible d\'exécuter la post validation du formulaire', [] ) );
  92. $referer = $request->headers->get( 'referer' );
  93. if(!$referer) return $this->redirectToRoute('app_register');
  94. return $this->redirect( $referer );
  95. }
  96. if ( $formRegister->isValid() )
  97. {
  98. // Post traitement du formulaire d'inscription
  99. try {
  100. $response = $this->formFactory->postProcessingRegisterForm( $formRegister, $user );
  101. }
  102. catch ( Exception|TransportExceptionInterface $e )
  103. {
  104. if($this->env === 'dev') throw $e;
  105. $this->logger->critical( $e->getMessage() );
  106. $this->addFlash( 'danger', 'impossible d\'exécuter le post traitement du formulaire :' . $e->getMessage() );
  107. $referer = $request->headers->get( 'referer' );
  108. if(!$referer) return $this->redirectToRoute('app_register');
  109. return $this->redirect( $referer );
  110. }
  111. if ( $response[ 'message' ] !== NULL ) {
  112. $this->addFlash( isset($response['type']) ? $response['type'] : 'success', $response[ 'message' ] );
  113. }
  114. return $this->redirectToRoute( $response[ 'route' ] );
  115. }
  116. }
  117. $twigPath = 'registration/register.html.twig';
  118. if (
  119. isset( $registerConfig[ 'folder' ] )
  120. && !in_array( $registerConfig[ 'folder' ], [ NULL, FALSE, '' ], TRUE )
  121. ) {
  122. $twigPath = 'registration/' . $registerConfig[ 'folder' ] . '/register.html.twig';
  123. }
  124. return $this->render( $twigPath, [
  125. 'registrationForm' => $formRegister->createView(),
  126. ] );
  127. }
  128. /**
  129. * Page d'attente de validation de l'inscription
  130. *
  131. * @Route("/register/waiting_validation", name="app_register_waiting_validation")
  132. *
  133. * @return Response
  134. */
  135. public function waitingRegisterValidation(): Response
  136. {
  137. return $this->render( 'registration/waiting_register_validation.html.twig' );
  138. }
  139. }