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...)
C'est la porte d'entrée unique de votre application Symfony.
index.php
Le routeur est comme un GPS ou un aiguilleur de train 🚦
Son travail :
/produits// Dans ProductController.php
#[Route('/produits', name: 'app_product_list')]
public function index(): Response
{
// Code ici...
}
Correspondance :
/produits → ProductController::index()/produits/5 → ProductController::show(5)/contact → ContactController::index()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
]);
}
}
C'est la BIBLIOTHÈQUE DE DONNÉES 📚 de votre application.
Il est composé de 2 parties :
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...
}
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();
}
}
C'est la VITRINE 🎨 de votre application, ce que voit l'utilisateur !
Dans Symfony, on utilise Twig :
templates/.html.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 :
{{ variable }} → Afficher une variable{% for %} → Boucle{% if %} → Condition{% extends %} → Hériter d'un template parentÀ la fin, Symfony renvoie une réponse HTTP au navigateur :
Le navigateur reçoit du HTML, CSS, JavaScript et affiche la page à l'utilisateur !
Scenario : Un utilisateur veut voir la liste des produits
https://monsite.com/produitspublic/index.php/produitsProductController::index()ProductRepository tous les produitsproduct/index.html.twigArchitecture MVC avec Symfony
Document pédagogique pour débutants