Principes du pattern MVC
Le MVC (Modele-Vue-Controleur) est un patron d'architecture logicielle qui separe une application en trois composants distincts. Chaque composant a une responsabilite unique et bien definie, ce qui rend le code plus maintenable, testable et evolutif.
Les trois composants
Modele (Model) : gere les donnees et la logique metier. Il represente l'etat de l'application et les regles de gestion. Dans Symfony, ce sont les entites Doctrine, les repositories et les services.
Vue (View) : gere l'affichage et la presentation. Elle recoit les donnees du controleur et les transforme en HTML, JSON, ou tout autre format. Dans Symfony, ce sont les templates Twig.
Controleur (Controller) : fait le lien entre le Modele et la Vue. Il recoit les requetes HTTP, interagit avec le Modele pour recuperer ou modifier les donnees, puis transmet les donnees a la Vue pour l'affichage.
Flux d'une requete MVC
Navigateur → Requete HTTP
↓
Router (determine quel controleur appeler)
↓
Controleur (recoit la requete)
↓
Modele (recupere/modifie les donnees)
↓
Controleur (transmet les donnees a la vue)
↓
Vue (genere le HTML)
↓
Reponse HTTP → NavigateurExemple concret dans Symfony
php// MODELE : src/Entity/Article.php
#[ORM\Entity]
class Article
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\Column(length: 255)]
private ?string $title = null;
#[ORM\Column(type: Types::TEXT)]
private ?string $content = null;
#[ORM\Column]
private ?\DateTimeImmutable $publishedAt = null;
// Getters et setters...
}
// MODELE : src/Repository/ArticleRepository.php
class ArticleRepository extends ServiceEntityRepository
{
public function findLatest(int $limit = 10): array
{
return $this->createQueryBuilder('a')
->orderBy('a.publishedAt', 'DESC')
->setMaxResults($limit)
->getQuery()
->getResult();
}
}php// CONTROLEUR : src/Controller/ArticleController.php
class ArticleController extends AbstractController
{
#[Route('/articles', name: 'article_list')]
public function list(ArticleRepository $repo): Response
{
$articles = $repo->findLatest(20);
return $this->render('article/list.html.twig', [
'articles' => $articles,
]);
}
}twig{# VUE : templates/article/list.html.twig #}
{% extends 'base.html.twig' %}
{% block body %}
<h1>Derniers articles</h1>
{% for article in articles %}
<article>
<h2>{{ article.title }}</h2>
<time>{{ article.publishedAt|date('d/m/Y') }}</time>
<p>{{ article.content|u.truncate(200, '...') }}</p>
</article>
{% endfor %}
{% endblock %}