Aller au contenu principal

Publié le 18/04/25

Comment Symfony a transformé Drupal

Caroline Chapeau
Caroline Chapeau
Développeuse
8 minutes
Partager :

Depuis Drupal 8, Drupal a entamé une véritable mutation architecturale. L'époque du CMS monolithique codé en PHP procédural, peu structuré est terminée. En s'appuyant sur les composants Symfony, Drupal a adopté une structure moderne basée sur l'injection de dépendances, le routage explicite, les services, les événements et la testabilité. 

Cette hybridation n'est pas qu'une modernisation technique : elle ouvre le CMS à une échelle d’usage bien plus large, jusqu'à devenir un framework applicatif pour les projets sur-mesure complexes. 

Illustration vectorielle représentant le logo de Drupal ouvert comme une coque, révélant un mécanisme interne composé d’engrenages.

Drupal en quelques mots…

 

Drupal est un système de gestion de contenu PHP et open source. Il alimente plus de 1,7 millions de site web.1 

Bien que les statistiques affichent une part de marché globale plus faible que pour les autres CMS (Wordpress, Joomla, Wix..), Drupal détient un peu plus de 6% des 10 000 sites les plus importants1. Certains gouvernements comme la France et l’Australie, la commission Européenne, l’UNESCO, la SNCF  et même Tesla l’utilisent. 

 

Symfony c’est quoi au fait ? 

 

Symfony c’est un framework PHP open-source. Pour faire simple, c’est comme une grande « boite à outils », il regroupe de nombreux composants qui facilitent le développement des sites ou applications web. 

C’est l’un des framework PHP les plus populaires et puissant sur le marché. Le nombre de téléchargement de ses composants a dépassé les 29 milliards2. 

Symfony a rejoint Drupal depuis sa version 8 en 2015 avec Symfony 3. Aujourd'hui, Drupal 11 utilise Symfony 7. 

Mais pourquoi Drupal utilise Symfony ?

  • Sa fiabilité et maturité

      Symfony jouit d'une solide réputation comme l'un des frameworks PHP les plus fiables et les plus aboutis.  

    • Sa productivité

        Symfony, c’est surtout une collection de composants PHP découplés et interopérables, conçus selon les standards PSR

      • Son architecture flexible

          Il permettre aux développeurs de sa communauté de développer plus rapidement, inutile de réinventer la roue et invite à la normalisation des bonnes pratiques. 

        • Sa communauté active

            Il est largement testé et maintenu par une grande communauté. Ce qui lui permet d’avoir une excellente documentation. 

          • Sa pérennité

              Symfony est l'un des rares frameworks bénéficiant d'un soutien commercial.

            Cela veut dire quoi concrètement ? 

            • Avant Symfony, un site Drupal c’est comme une voiture construite entièrement sur-mesure avec ses propres pièces.
            • Avec Symfony, un site Drupal profite de pièces déjà construites et utilisées sur d’autres voitures, garantissant plus de fiabilité et moins de maintenance. 

            C’est bien beau toutes ces explications, mais pour un développeur ça se traduit comment ? 

            Drupal exploite par exemple les composants Symfony suivant : 

             

            • HttpFoundation : Abstraction des requêtes et réponses HTTP
            • HttpKernel : Gestion du cycle requête/réponse (Middleware-like)
            • EventDispatcher : Remplacement des hook_* par des événements
            • Filesystem : Fournit des utilitaires pour le système de fichiers.
            • Finder : Recherche des fichiers et des répertoires.
            • Console : Exécution de commandes personnalisées (CLI)
            • DependencyInjection : Container de services, injection via YAML/annotations
            • Polyfill Iconv : Fournit des fonctions manquantes dans certaines versions de PHP.
            • Process : Exécute les commandes dans les sous-processus`
            • Routing : Définition d'URL, mapping vers des contrôleurs
            • Mime : Identifie et gère les types de contenu des fichiers et des réponses HTTP.
            • Serializer : (Dé)sérialisation JSON, XML, etc.
            • Mailer : Gère l'envoi d'emails transactionnels ou de notifications.
            • PsrHttpMessageBridge : Fait le lien entre les interfaces PSR-7 et HttpFoundation.
            • Validator : Vérifie l'intégrité et la conformité des données saisies ou traitées.
            • Yaml : Lit et écrit les configurations et définitions stockées en .yml 

             

            Certains autres composants comme Twig et Doctrine ne sont pas mentionnés mais sont une grande avancée pour Drupal.

            Avantages apportés par Symfony

            Clarté et découplage du code

            Symfony étant basé sur la POO et les standards PHP modernes (PSR, namespace, autoloading..), Drupal a abandonné son vieux modèle procédural pour des classes plus claires et organisées. Cela permet d’être beaucoup plus flexible, testable et plus maintenable. Le cœur de Drupal est devenu plus modulaire et interopérable.

            Le système de routage est beaucoup plus puissant et lisible. Il permet de lier une URL à un contrôleur tout en gérant les permissions, le format de réponse.

            Exemple de route :

            my_module.index:

             path: '/my-path'

             defaults:

               _controller: '\Drupal\my_module\Controller\MyController::index'

             requirements:

               _permission: 'access content' 
             

            Orchestration via événements

            Au lieu d’utiliser les hook procéduraux, on peut désormais écouter proprement des évènements (et en créer). Un module peut se brancher à n’importe quel moment du cycle de vie d’une requête grâce à l’EventSubscriberInterface. Les modules deviennent moins couplés, plus lisibles et plus facilement testables.

            Cependant, il est important de comprendre que les hook procéduraux sont encore utilisés pour certains fonctionnements natifs de Drupal (altération d’un formulaire, préprocesseur de thème par exemple). 
             

            Extensibilité horizontale

            Symfony fonctionne avec des containers de services. Les classes dépendent les unes des autres grâce à l’injection de dépendances.

            On peut alors injecter des services dans les contrôleurs, formulaires, plugins etc. Cela rend le code beaucoup plus modulaire, testable.

            Les fonctionnalités n’ont donc plus rien à faire dans le fichier .module ancestral de Drupal et peuvent être organisées dans des services. On peut très bien utiliser n’importe quel Design Pattern selon le besoin. 

            L’injection de dépendances rend le code plus maintenable, modulaire et extensible. Le code est plus lisible pour les développeurs, les dépendances sont visibles dès le constructeur. On n’a plus besoin de se préoccuper de la durée de vie des objets, c’est le conteneur Symfony qui gère ça comme un grand. 

            Exemple d’instanciation d’un service dans un fichier: my_module.services.yml

            services:  

            my_module.my_service:

               class: Drupal\my_module\Service\MyService

            arguments: [‘@logger.factory']

             

            Example d’implémentation du service dans une classe:

            public function __construct( 

            public readonly MyService $myService

            ) {}

            Moteur de template moderne


            Fini les *.tpl.php procéduraux, fini le code PHP spaghetti dans les templates ! Place au Twig permettant une meilleure lisibilité, maintenabilité et héritage de templates.

            Mais ce n’est pas tout ! Le PHP n’est plus permis dans les templates, on améliore donc la sécurité. Il y a une vraie volonté de séparer la logique et le HTML, pour le plus grand bonheur des développeurs back-end !  

            Spoiler Alert : On peut tout de même créer des fonctions Twig grâce au TwigExtension afin d’ajouter une légère logique tout en respectant la séparation logique/template. Attention tout de même à limiter ses usages pour éviter l’usine à gaz. Ces fonctions ne doivent pas remplacer les preprocess(), contrôleurs ou plugins. Les templates ne doivent faire que de l’affichage. 

            Performance et maintenabilité

            Grâce à Symfony, Drupal a repensé son système de gestions des entités en utilisant certains composants de Doctrine. Drupal n’utilise pas l’ORM car ses entités sont dynamiques et ne sont pas mappés de manière rigide à des classes/tables et certaines entités ne sont pas en base de données mais plutôt des configurations YAML. Cependant, il a son propre mini-ORM en utilisant EntityAPI. Drupal propose donc une version inspirée des idées modernes de Doctrine mais à sa sauce :

            $node = $this->entityTypeManager

            ->getStorage(‘node’)->load(42); 

            $title = $node->getTitle();

            Ou requête via l’EntityQuery :

            $nids = $this->entityTypeManager

            ->getQuery 

            ->condition('status', 1) 

            ->execute(); 

            Concrètement, c’est orienté objet, typé, injectable et étendus par les plugins MAIS, ce n’est pas Doctrine ORM.

            De plus, la rigueur structurelle apportée par Symfony permet de mieux profiler, optimiser et segmenter les responsabilités :

            • Le temps de chargement réduite (merci au cache routage, compilation de service)
            • Meilleure couverture de tests. Symfony facilite les tests unitaires, fonctionnels et d’intégration. Là où il était compliqué de faire des tests, PHPUnit et NightWatch sont nos nouveaux meilleurs amis.
            • Une scalabilité facilitée avec une approche DDD, microservices et API.

            Les composants de Symfony ont été conçus dans un souci d’efficacité, Drupal a considérablement progressé en terme de performance grâce à ces composants. 

            Finalement, si on récap’ rapidement… 

            L'intégration de Symfony dans Drupal n’est pas juste une mise à jour d’une majeur, c’est un changement de paradigme qui transforme le CMS en une base applicative moderne, extensible, testable et alignée avec les nouveaux standards PHP. Pour les projets plus complexes et spécifiques, cette architecture hybride est un véritable levier de qualité, de robustesse et d’évolutivité. Elle permet aussi de faire converger les compétences Symfony et Drupal dans une même équipe tech.

            Là où il n’était pas possible de faire du headless avec Drupal, aujourd’hui tout est possible. Le site sur lequel vous lisez cet article est réalisé en Drupal headless !

             

            1 https://trends.builtwith.com/cms/Drupal

            2 https://symfony.com/stats/downloads

            Vous souhaitez en parler ?

            Contactez-nous !
            Contacter

            D’après mes analyses

            Nos projets et notre expertise vous intéressent ? Et si nous en discutions ?