retour
01/03
section 01

Principes du pattern MVC

Connectez-vous pour sauvegarder votre progression et acceder aux quiz
Se connecter

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 → Navigateur

Exemple 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 %}

Avantages du MVC

1.Separation des responsabilites : chaque composant a un role clair. Un designer peut modifier la Vue sans toucher au Modele.
2.Testabilite : les Modeles peuvent etre testes independamment des Vues et des Controleurs.
3.Reutilisabilite : un Modele peut etre utilise par plusieurs Controleurs (API + Web par exemple).
4.Maintenabilite : les modifications sont localisees. Changer la base de donnees n'affecte que le Modele.