// PHP

Symfony : le framework PHP français expliqué

Symfony est le framework PHP le plus influent de l’écosystème francophone. Né dans une agence web française, il s’est imposé comme une référence pour bâtir des applications robustes et maintenables, au point que ses composants alimentent d’autres projets majeurs — dont une partie de Laravel et de Drupal. Ce guide explique sa philosophie, sa structure, et ses briques essentielles : routes, contrôleurs, Twig et Doctrine. De quoi comprendre ce que vous gagnez à l’adopter et pour quels projets il brille.

Qu’est-ce que Symfony ?

Symfony est un framework web complet écrit en PHP, publié sous licence open source. Il repose sur une idée centrale : fournir un ensemble de composants découplés et réutilisables, que l’on peut assembler pour construire une application sur mesure. On distingue en réalité deux choses :

  • Les composants Symfony : des bibliothèques indépendantes (routing, HTTP, validation, sécurité…) utilisables même hors du framework.
  • Le framework Symfony : l’assemblage cohérent de ces composants, avec des conventions et un outillage, pour développer vite et bien.

Cette architecture modulaire explique sa réputation de sérieux. Là où d’autres frameworks imposent une seule façon de faire, Symfony privilégie la flexibilité et l’explicite. C’est un socle exigeant mais formateur, qui apprend les bonnes pratiques de conception. Si vous débutez tout juste en PHP, notre guide PHP pour débuter pose les bases indispensables avant d’aborder un framework.

Installer Symfony

Symfony s’installe via Composer, le gestionnaire de dépendances de PHP. L’outil officiel symfony CLI facilite en plus le lancement d’un serveur local. Pour créer une nouvelle application web :

composer create-project symfony/skeleton mon-projet
cd mon-projet
composer require webapp

Le paquet webapp ajoute les dépendances utiles à une application web classique (Twig, formulaires, Doctrine…). Lancez ensuite le serveur de développement :

symfony serve

Votre application est disponible sur https://localhost:8000. Symfony est livré avec une barre de débogage en bas de page, précieuse pour inspecter requêtes, temps d’exécution et requêtes SQL.

La structure du projet et le modèle MVC

Symfony suit une organisation prévisible. Les dossiers clés sont :

  • src/Controller/ : les contrôleurs, cœur de la logique.
  • src/Entity/ : les entités, représentation objet des données.
  • templates/ : les vues, écrites en Twig.
  • config/ : la configuration (routes, services, sécurité).
  • public/ : le point d’entrée web (index.php).

Cette structure incarne le patron MVC (Modèle-Vue-Contrôleur). Le contrôleur reçoit la requête et orchestre la réponse, le modèle (les entités gérées par Doctrine) porte les données, et la vue (les templates Twig) produit le HTML. Séparer ces responsabilités rend le code testable et évolutif.

Routes et contrôleurs

Une route associe une URL à une méthode de contrôleur. En Symfony moderne, on les déclare avec des attributs PHP directement au-dessus des méthodes :

<?php
// src/Controller/ArticleController.php
namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;

class ArticleController extends AbstractController
{
    #[Route('/articles', name: 'article_liste')]
    public function liste(): Response
    {
        return $this->render('article/liste.html.twig', [
            'articles' => ['Débuter en PHP', 'Découvrir Symfony'],
        ]);
    }

    #[Route('/articles/{id}', name: 'article_detail')]
    public function detail(int $id): Response
    {
        return new Response("Article numéro $id");
    }
}

Deux mécanismes essentiels apparaissent. L’attribut #[Route] lie une URL à une action, et le paramètre dynamique {id} est automatiquement injecté dans la méthode, converti au bon type. Nommer les routes (name:) permet de générer des URLs sans les coder en dur, ce qui rend l’application maintenable.

Twig, le moteur de templates

Symfony n’écrit pas de HTML directement dans le contrôleur : il délègue à Twig, un moteur de templates clair et sécurisé. Twig échappe automatiquement les variables, ce qui protège des failles XSS par défaut.

{# templates/article/liste.html.twig #}
{% extends 'base.html.twig' %}

{% block body %}
  <h1>Nos articles</h1>
  <ul>
    {% for titre in articles %}
      <li>{{ titre }}</li>
    {% else %}
      <li>Aucun article pour le moment.</li>
    {% endfor %}
  </ul>
{% endblock %}

Twig apporte l’héritage de templates : un gabarit base.html.twig définit la structure commune (en-tête, pied de page), et chaque page ne redéfinit que les blocs utiles. On évite ainsi toute duplication de mise en page.

Bonne pratique — La logique dans le contrôleur, l’affichage dans Twig Résistez à la tentation de mettre des calculs ou des accès base de données dans un template. Twig sert à présenter des données déjà préparées. Cette discipline garde vos vues lisibles et vos contrôleurs testables.

Doctrine et la base de données

Symfony s’appuie sur Doctrine, un ORM (Object-Relational Mapping) qui fait correspondre des classes PHP à des tables de base de données. Vous manipulez des objets ; Doctrine génère le SQL. Une entité se définit avec des attributs :

<?php
// src/Entity/Article.php
namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity]
class Article
{
    #[ORM\Id, ORM\GeneratedValue, ORM\Column]
    private ?int $id = null;

    #[ORM\Column(length: 200)]
    private string $titre = '';

    public function getTitre(): string
    {
        return $this->titre;
    }

    public function setTitre(string $titre): self
    {
        $this->titre = $titre;
        return $this;
    }
}

Doctrine peut ensuite créer ou faire évoluer le schéma via les migrations, sans écrire de SQL à la main :

php bin/console make:migration
php bin/console doctrine:migrations:migrate

Pour interroger la base, on passe par le EntityManager ou un Repository. Récupérer tous les articles devient aussi simple que :

<?php
$articles = $entityManager->getRepository(Article::class)->findAll();

L’ORM apporte confort et sécurité, mais il faut rester attentif aux performances : charger des relations sans précaution peut multiplier les requêtes. Doctrine fournit des outils (jointures explicites, chargement paresseux maîtrisé) pour garder la main.

Les bundles : étendre Symfony

Un bundle est un plugin réutilisable qui ajoute des fonctionnalités au framework. C’est ainsi que Symfony intègre l’authentification, l’administration, les API ou l’envoi d’e-mails. On installe un bundle via Composer, et le système de recipes configure automatiquement le projet :

composer require symfony/security-bundle

L’écosystème compte de nombreux bundles majeurs : EasyAdmin pour générer une interface d’administration, API Platform pour bâtir des API REST et GraphQL, ou encore le composant Messenger pour les traitements asynchrones. Cette extensibilité fait de Symfony une base solide pour des projets qui grandissent.

Pour quels projets choisir Symfony ?

Aucun outil n’est universel. Symfony brille dans des contextes précis :

  • Applications métier complexes : intranets, ERP, plateformes de gestion où la rigueur et la maintenabilité priment.
  • Projets au long cours : la structure claire et le typage fort facilitent le travail en équipe et la reprise du code.
  • API robustes : couplé à API Platform, il construit rapidement des API bien documentées — un terrain que nous détaillons dans notre guide des API REST.

À l’inverse, pour un très petit site vitrine ou un prototype jetable, la puissance de Symfony peut sembler surdimensionnée. Son exigence initiale est réelle : on ne devient pas productif en une heure. Mais cet investissement se rentabilise sur les projets sérieux, où le cadre évite le désordre à mesure que l’application grossit.

Bonne pratique — Apprendre les composants, pas seulement les recettes Symfony s’utilise vite avec le MakerBundle qui génère du code. Mais prenez le temps de comprendre ce que fait chaque composant : injection de dépendances, cycle de la requête HTTP, événements. Cette compréhension transforme un utilisateur du framework en véritable développeur Symfony.

En résumé

Symfony est un framework PHP mature qui impose de bonnes pratiques : séparation MVC, typage fort, composants découplés. Ses briques — routes par attributs, contrôleurs, templates Twig et ORM Doctrine — forment un ensemble cohérent, exigeant à l’entrée mais très gratifiant. Pour progresser, créez un projet réel : un blog avec entités, formulaires et back-office. En manipulant contrôleurs, Twig et Doctrine sur un cas concret, vous assimilerez la philosophie du framework bien plus vite qu’en théorie.

À lire ensuite