<?php
namespace App\Controller;
use App\Entity\User;
use App\Entity\School;
use App\Repository\SchoolRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
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\Security\Core\Exception\AccessDeniedException;
class RegistrationController extends AbstractController
{
/**
* @Route("/register", name="app_register")
*/
public function register(
Request $request,
UserPasswordHasherInterface $passwordHasher,
EntityManagerInterface $entityManager,
SchoolRepository $schoolRepository
): Response {
// Si l'utilisateur est déjà connecté, rediriger vers l'admin
if ($this->getUser()) {
return $this->redirectToRoute('admin');
}
$error = null;
$success = false;
if ($request->isMethod('POST')) {
$username = $request->request->get('username');
$password = $request->request->get('password');
$confirmPassword = $request->request->get('confirm_password');
$fullname = $request->request->get('fullname');
$email = $request->request->get('email');
$schoolId = $request->request->get('school');
$roleType = $request->request->get('role_type', 'user');
// Validation
if (empty($username) || empty($password) || empty($fullname)) {
$error = 'Tous les champs obligatoires doivent être remplis.';
} elseif ($password !== $confirmPassword) {
$error = 'Les mots de passe ne correspondent pas.';
} elseif (strlen($password) < 6) {
$error = 'Le mot de passe doit contenir au moins 6 caractères.';
} else {
// Vérifier si l'utilisateur existe déjà
$existingUser = $entityManager->getRepository(User::class)->findOneBy(['username' => $username]);
if ($existingUser) {
$error = 'Ce nom d\'utilisateur existe déjà.';
} else {
// Créer le nouvel utilisateur
$user = new User();
$user->setUsername($username);
$user->setFullname($fullname);
$user->setEmail($email);
$user->setPassword($passwordHasher->hashPassword($user, $password));
$user->setIsActive(true);
// Définir le rôle selon le type sélectionné
$user->setRoleByType($roleType);
// Associer l'école si sélectionnée
if ($schoolId) {
$school = $schoolRepository->find($schoolId);
if ($school) {
$user->setSchool($school);
}
}
try {
$entityManager->persist($user);
$entityManager->flush();
$success = true;
} catch (\Exception $e) {
$error = 'Une erreur est survenue lors de l\'enregistrement.';
}
}
}
}
// Récupérer toutes les écoles pour le formulaire
$schools = $schoolRepository->findAll();
return $this->render('registration/register.html.twig', [
'error' => $error,
'success' => $success,
'schools' => $schools,
'last_username' => $request->request->get('username', ''),
'last_fullname' => $request->request->get('fullname', ''),
'last_email' => $request->request->get('email', ''),
'last_school' => $request->request->get('school', ''),
'last_role_type' => $request->request->get('role_type', 'user'),
]);
}
}