🎯 Architecture MVC avec Symfony

Formation DWWM - Le cycle de vie d'une requête HTTP
Requête HTTP GET /produits Front Controller index.php / public/index.php ROUTEUR Analyse l'URL et trouve le bon Controller + méthode Routes définies dans les annotations CONTROLLER AppController / ProductController Méthodes : index(), show(), create()... 1 2 MODEL 📦 Entités (Entity) Product.php, User.php 🗄️ Repositories ProductRepository VIEW 📄 Templates Twig templates/ product/index.html.twig base.html.twig Réponse HTTP HTML généré + code 200 💡 Les flèches pleines = aller | Les flèches pointillées = retour
Routeur - Aiguilleur
Controller - Chef d'orchestre
Model - Données
View - Présentation

0 Départ : La Requête HTTP

Tout commence quand un utilisateur tape une URL dans son navigateur ou clique sur un lien :

// Exemple d'URL https://monsite.com/produits https://monsite.com/produits/5 https://monsite.com/contact

Le navigateur envoie une requête HTTP au serveur (GET, POST, PUT, DELETE...)

1 Front Controller

C'est la porte d'entrée unique de votre application Symfony.

💡 À retenir : Toutes les URLs passent par ce fichier unique. C'est pour ça qu'on configure le serveur web pour rediriger tout vers index.php

2 Le Routeur (Router)

Le routeur est comme un GPS ou un aiguilleur de train 🚦

Son travail :

// Dans ProductController.php #[Route('/produits', name: 'app_product_list')] public function index(): Response { // Code ici... }

Correspondance :

3 Le Controller (Contrôleur)

C'est le CHEF D'ORCHESTRE 🎼 de votre application !

Son rôle principal :

// src/Controller/ProductController.php namespace App\Controller; class ProductController extends AbstractController { #[Route('/produits', name: 'app_product_list')] public function index(ProductRepository $repo): Response { // ① Demande au Model les produits $produits = $repo->findAll(); // ② Envoie les données à la View return $this->render('product/index.html.twig', [ 'produits' => $produits ]); } }
🚫 Ce que le Controller ne fait PAS :
  • ❌ Ne fait pas de requêtes SQL directement
  • ❌ Ne contient pas de HTML
  • ❌ Ne gère pas la logique métier complexe

4 Le Model (Modèle)

C'est la BIBLIOTHÈQUE DE DONNÉES 📚 de votre application.

Il est composé de 2 parties :

A) Les Entités (Entity)

Ce sont des classes PHP qui représentent vos tables de base de données.

// src/Entity/Product.php namespace App\Entity; #[ORM\Entity] class Product { #[ORM\Id] #[ORM\GeneratedValue] #[ORM\Column] private ?int $id = null; #[ORM\Column(length: 255)] private ?string $name = null; #[ORM\Column] private ?float $price = null; // Getters et Setters... }

B) Les Repositories

Ce sont des classes qui font les requêtes en base de données.

// src/Repository/ProductRepository.php class ProductRepository extends ServiceEntityRepository { // Récupérer tous les produits public function findAll(): array // Récupérer un produit par son ID public function find($id): ?Product // Créer une requête personnalisée public function findByPriceRange($min, $max): array { return $this->createQueryBuilder('p') ->where('p.price >= :min') ->andWhere('p.price <= :max') ->setParameter('min', $min) ->setParameter('max', $max) ->getQuery() ->getResult(); } }
💡 Correspondance : Une entité = une table en base de données
Exemple : Product.php → table "product"

5 La View (Vue)

C'est la VITRINE 🎨 de votre application, ce que voit l'utilisateur !

Dans Symfony, on utilise Twig :

{# templates/product/index.html.twig #} {% extends 'base.html.twig' %} {% block title %}Liste des produits{% endblock %} {% block body %} <h1>Nos Produits</h1> <ul> {% for produit in produits %} <li> {{ produit.name }} - {{ produit.price }}€ </li> {% endfor %} </ul> {% endblock %}

Syntaxe Twig :

6 La Réponse HTTP

À la fin, Symfony renvoie une réponse HTTP au navigateur :

Le navigateur reçoit du HTML, CSS, JavaScript et affiche la page à l'utilisateur !

📝 Résumé en 3 points

  1. Le Routeur dit au Controller : "C'est toi qui gères !"
  2. Le Controller dit au Model : "Donne-moi les données" et à la View : "Affiche-les"
  3. La View transforme les données en HTML que le navigateur peut afficher

🎯 Exemple concret complet

Scenario : Un utilisateur veut voir la liste des produits

  1. 👤 L'utilisateur tape : https://monsite.com/produits
  2. 🚪 La requête arrive sur public/index.php
  3. 🗺️ Le Routeur lit l'URL /produits
  4. 🎯 Il trouve la route et appelle ProductController::index()
  5. 🧠 Le Controller demande au ProductRepository tous les produits
  6. 🗄️ Le Repository fait une requête SQL et retourne les données
  7. 📄 Le Controller envoie ces données au template product/index.html.twig
  8. 🎨 Le template Twig génère du HTML avec les produits
  9. 📤 Symfony renvoie la page HTML au navigateur
  10. ✅ L'utilisateur voit la page avec la liste des produits !

🎓 Formation DWWM

Architecture MVC avec Symfony

Document pédagogique pour débutants