Vous travaillez pour EduTech Solutions, une startup spécialisée dans les plateformes d'apprentissage en ligne. L'entreprise souhaite développer une nouvelle plateforme permettant de gérer des formations, des apprenants, et des instructeurs.
Votre équipe a été chargée de créer le module de gestion des données de cette plateforme. Le système doit permettre de :
- Gérer les formations avec leurs modules et leçons
 - Inscrire des apprenants aux formations
 - Assigner des instructeurs aux formations
 - Suivre les progrès des apprenants
 
Votre mission : modéliser et implémenter la couche de données avec Doctrine ORM.
Compétences techniques visées :
- Installer et configurer Doctrine ORM dans un projet Symfony
 - Concevoir et créer des entités avec leurs propriétés et contraintes
 - Implémenter les relations entre entités (OneToMany, ManyToOne, ManyToMany)
 - Utiliser le système de migrations pour faire évoluer la base de données
 - Gérer le cycle de vie des entités avec l'EntityManager
 
Compétences transversales :
- Analyser un cahier des charges pour en extraire un modèle de données
 - Structurer et organiser son code selon les bonnes pratiques
 - Documenter ses choix techniques et respecter les contraintes réglementaires
 
Créez un nouveau projet Symfony nommé formation-platform et installez les dépendances nécessaires :
# Créer le projet
symfony new formation-platform --webappConfigurez la stack docker afin d'avoir un container de base de données et un container PHPMYAdmin, mettez à jour le fichier compose.yaml:
services:  
  database:  
    container_name: tp3-database  
    image: mariadb:10.11.2  
    ports:  
      - "3306:3306"  
    restart: always  
    environment:  
      MYSQL_DATABASE: app_db  
      MYSQL_ALLOW_EMPTY_PASSWORD: 'no'  
      MYSQL_ROOT_PASSWORD: root  
    volumes:  
      - ./var/dbdata:/var/lib/mysql  
    networks:  
      - tp3_network  
  phpmyadmin:  
    container_name: tp3-pma  
    image: phpmyadmin/phpmyadmin  
    ports:  
      - "8081:80"  
    environment:  
      PMA_HOST: database  
      PMA_PORT: 3306  
      PMA_ARBITRARY: 1  
      UPLOAD_LIMIT: 1G  
      MEMORY_LIMIT: 512M  
      MAX_EXECUTION_TIME: 0  
    restart: always  
    links:  
      - database  
    networks:  
      - tp3_network  
networks:  
  tp3_network:Configurez votre connexion à la base de données dans le fichier .env :
# Exemple pour MySQL/MariaDB
DATABASE_URL="mysql://root:root@127.0.0.1:3306/app_db?serverVersion=10.11.2-MariaDB&charset=utf8mb4"Démarrez les containers:
docker compose up -dCréez la base de données :
symfony console doctrine:database:createVérification : Assurez-vous que la base de données est créée sans erreur.
Créez une entité Utilisateur qui servira de base pour les apprenants et instructeurs :
Propriétés requises :
id: identifiant unique auto-généréemail: adresse email unique, obligatoirenomAffichage: nom d'affichage public, 100 caractères maxmotDePasse: mot de passe hashédateInscription: date d'inscription automatiqueestActif: booléen pour activer/désactiver le compte
Contraintes de validation :
- Email valide et unique
 - Nom d'affichage : minimum 2 caractères, maximum 100
 
symfony console make:user UtilisateurCréez l'entité Formation représentant une formation proposée :
Propriétés requises :
id: identifiant uniquetitre: titre de la formation, 200 caractères maxdescription: description détaillée (text)dureeHeures: durée en heures (entier)niveauDifficulte: niveau (string : 'Débutant', 'Intermédiaire', 'Avancé')prix: prix en euros (decimal avec 2 décimales)dateCreation: date de création automatiqueestPubliee: booléen pour publier/dépubliercapaciteMax: nombre maximum d'apprenants (nullable)
Contraintes de validation :
- Titre : obligatoire, 10-200 caractères
 - Durée : minimum 1 heure
 - Prix : positif ou zéro
 - Niveau : doit être une des trois valeurs autorisées
 
symfony console make:entity FormationCréez l'entité Module représentant un module de formation :
Propriétés requises :
id: identifiant uniquetitre: titre du module, 150 caractères maxdescription: description du moduleordre: position du module dans la formation (entier)dureeEstimee: durée estimée en minutes
symfony console make:entity ModuleImplémentez la relation entre Formation et Module :
- Une formation contient plusieurs modules
 - Un module appartient à une seule formation
 - La suppression d'une formation doit supprimer ses modules
 
Mission autonome : Implémentez cette relation bidirectionnelle avec les méthodes d'ajout/suppression appropriées.
Implémentez la relation entre Formation et Utilisateur (instructeurs) :
- Un instructeur peut enseigner plusieurs formations
 - Une formation peut avoir plusieurs instructeurs
 - Utilisez une table de liaison simple
 
Conseils :
- Ajoutez une méthode 
getFormationsEnseignees()à l'entité Utilisateur - Ajoutez une méthode 
getInstructeurs()à l'entité Formation 
Créez une entité Inscription pour gérer les inscriptions des apprenants :
Propriétés requises :
id: identifiant uniqueapprenant: relation vers Utilisateur (ManyToOne)formation: relation vers Formation (ManyToOne)dateInscription: date d'inscription automatiquestatut: statut ('En cours', 'Terminée', 'Abandonnée')progressionPourcentage: progression de 0 à 100 (entier)dateFin: date de fin (nullable)note: note finale sur 20 (nullable, decimal)
Générez les migrations pour vos entités :
symfony console make:migrationVérification : Examinez le fichier de migration généré et assurez-vous qu'il correspond à votre modélisation.
Exécutez les migrations :
symfony console doctrine:migrations:migrateCréez un contrôleur de test TestController avec les routes suivantes :
Route /test/creation-donnees : Créez et persistez :
- 2 utilisateurs (1 instructeur, 1 apprenant)
 - 1 formation avec 2 modules
 - 1 inscription de l'apprenant à la formation
 - Assignez l'instructeur à la formation
 
Route /test/affichage-donnees : Affichez :
- La liste des formations avec leurs instructeurs
 - Les inscriptions avec les informations des apprenants
 - Les modules de chaque formation
 
Mission autonome : Implémentez ces contrôleurs en utilisant l'EntityManager pour tester votre modélisation.
Installer le package fakerphp/faker, puis créer les fichiers de fixtures.
Documentation
Mission autonome : Créer un jeu d'essai complet et éxécuter la commande de chargement des fixtures.
Créez un contrôleur FormationController avec :
Route /formations : Liste toutes les formations publiées avec :
- Titre, description courte, durée, prix
 - Nombre d'inscrits / capacité maximale
 - Noms des instructeurs
 
Route /formation/{id} : Détail d'une formation avec :
- Toutes les informations de la formation
 - Liste des modules avec leur ordre
 - Instructeurs assignés
 - Bouton d'inscription (simulé)
 
Mission créative : Utilisez Bootstrap pour créer une interface claire et professionnelle.
Bonojour
