<?php
namespace App\Controller;
use App\Entity\User;
use App\Factory\Security\SecurityFormFactory;
use App\Form\Type\LoginType;
use App\Services\DTV\YamlConfig\YamlReader;
use Exception;
use LogicException;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
/**
* Controller qui gère la sécurité
*/
class SecurityController extends AbstractController
{
private YamlReader $yamlReader;
private SecurityFormFactory $formFactory;
public function __construct(
YamlReader $yamlReader,
SecurityFormFactory $formFactory
) {
$this->yamlReader = $yamlReader;
$this->formFactory = $formFactory;
}
/**
* Formulaire de connexion
*
* @Route("/login", name="app_login")
*
* @param AuthenticationUtils $authenticationUtils
* @param Request $request
*
* @return Response
*/
public function login(AuthenticationUtils $authenticationUtils, Request $request): Response
{
// Redirige sur la home-page si le user est connecté
if ($this->getUser()) {
return $this->redirectToRoute('front_homepage');
}
$user = new User();
$config = $this->yamlReader->getFrontSecurity();
$configLogin = $config[ 'login' ];
$globalRegister = $this->yamlReader->getRegister();
$globalRegisterEnabled = $globalRegister[ 'enabled' ];
$configRegister = $configLogin[ 'sections' ][ 'section_register' ] ?? FALSE;
$hasFormRegister = FALSE;
$formRegister = FALSE;
if ($globalRegisterEnabled && is_array($configRegister) && $configRegister[ 'enabled' ]) {
// Création du formulaire d'inscription
try {
$formRegister = $this->formFactory->generateRegisterForm($user);
$hasFormRegister = TRUE;
} catch (Exception $e) {
throw $this->createNotFoundException($e->getMessage());
}
$formRegister->handleRequest($request);
if ($formRegister->isSubmitted()) {
// validation spécifique du formulaire d'inscription
try {
$formRegister = $this->formFactory->postValidateRegisterForm($formRegister);
} catch (Exception $e) {
$this->addFlash('danger', 'Impossible d\'exécuter la post validation du formulaire');
$referer = $request->headers->get('referer');
return $this->redirect($referer);
}
if ($formRegister->isValid()) {
// Post traitement du formulaire d'inscription
try {
$response = $this->formFactory->postProcessingRegisterForm($formRegister, $user);
} catch (Exception $e) {
$this->addFlash('danger', 'Impossible d\'exécuter le post traitement du formulaire: '.$e->getMessage());
$referer = $request->headers->get('referer');
return $this->redirect($referer);
} catch (TransportExceptionInterface $e) {
$this->addFlash('danger', 'Impossible d\'exécuter le post traitement du formulaire: '.$e->getMessage());
$referer = $request->headers->get('referer');
return $this->redirect($referer);
}
if ($response[ 'message' ] !== NULL) {
$this->addFlash('success', $response[ 'message' ]);
}
return $this->redirectToRoute($response[ 'route' ]);
}
}
}
$formLogin = $this->createForm(LoginType::class);
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
$twigPath = 'security/login.html.twig';
if ($this->yamlReader->getType() === 'dtv') {
$twigPath = 'security/DeveloppetesventesCom/login.html.twig';
}
if (isset($configLogin[ 'folder' ])
&& !in_array($configLogin[ 'folder' ], [FALSE, '', NULL], TRUE)
) {
$twigPath = 'security/'.$configLogin[ 'folder' ].'/login.html.twig';
}
return $this->render($twigPath, [
'last_username' => $lastUsername,
'error' => $error,
'loginForm' => $formLogin->createView(),
'registrationForm' => $hasFormRegister ? $formRegister->createView() : FALSE,
]);
}
/**
* Déconnexion
*
* @Route("/logout", name="app_logout")
*
* @return void
*/
public function logout(): void
{
throw new LogicException(
'This method can be blank - it will be intercepted by the logout key on your firewall.'
);
}
}