Couverture de l'article Twig et comment optimiser son API Symfony2

Twig, le composant de gestion de templates par défaut dans Symfony est intégré mais est désactivable pour une API par exemple.

Quand j'ai dit que je travaillais avec Symfony2 pour mon API, le premier commentaire a été : "mais pourquoi tu utilises Symfony ?". On peut évidemment se demander pourquoi, sachant qu'une API est souvent RESTFul. Je vais donc vous expliquer pourquoi nous utilisons Symfony2 chez Wanadev.

Symfony2 et ses outils

Avant tout, lorsque l'on m'a confié ce projet, celui-ci était déjà développé avec Symfony, et cela parce que l'API n'était pas RESTFul au départ. Celle-ci retournait des iframes. L'héritage était donc là et Symfony offre de nombreux outils pour « packager » ce type d'application. Gestion de la sécurité, des templates… Parfait à ce moment !

Avec le temps, nous avons voulu rendre plus light notre service et donner à notre API une véritable image d'API en la rendant progressivement RESTFul. Cela n'est pas un travail aisé, car tous les services rattachés doivent suivre le « mouvement » et s'adapter. Lorsque cette opération a été terminée, nous avions alors deux possibilités qui se présentaient à nous :

  1. Réécrire l'API avec un framework plus léger comme Silex
  2. Garder le code existant et tenter d'alléger les modules utilisés par Symfony (ça, on sait faire chez Wanadev)

Un choix a rapidement été fait. Nous avons déjà développé une API Silex, un framework léger et rapide, mais qui au fil du temps à tendance à grossir considérablement de par l'ajout des modules non natif. Si Silex possède le défaut d'être complètement vide initialement (mais c'est également sa marque de fabrique), Symfony possède l'inconvénient inverse d'embarquer de nombreux modules nativement. Il suffit de regarder le composer.json de Symfony pour faire ce constat.

Nous avons donc préféré Symfony, de par la possibilité de développer rapidement tout notre code métier, mais aussi par sa communauté en perpétuel agrandissement.

Choix des composants essentiels

Dans Symfony, pour tous ceux qui hésiteraient encore, sachez que de nombreux modules sont utiles. Certains pourront être désactivés et d'autres sont intégrés dans le core et sont par conséquent indétachables.

Twig, le composant de gestion de templates par défaut dans Symfony est intégré et il est donc impossible de l'enlever. Le framework requiert Symfony/TwigBundle qui requiert à son tour Twig/Twig, le moteur de template a proprement parlé. Comme je viens de le dire, Twig ne donc pas être enlever, de plus certains composants très utiles comme symfony/web-profiler-bundle requiert l'engine pour générer la « debug bar » qu'on apprécie lors de nos développements.

Mais ne perdons pas espoir ! Il existe tout de même une solution pour désactiver Twig. Le web profiler est acif uniquement lorsqu'il a été chargé pour un environnement donné. De base, Symfony propose deux environnements, dev et prod. Le premier ajoute quelques modules. Voici ceux qui sont présents initialement :

  • WebProfilerBundle
  • SensioDistributionBundle
  • SensioGeneratorBundle

Ils nous proposent des outils uniquement pour l'environnement de développement. Ce qui va permettre de ne pas surcharger l'environnement de production que l'on veut rapide.

Désactiver Twig dans Symfony

Comme nous l'avons vu plus haut, le web profiler requiert Twig, nous allons simplement l'activer pour l'environnement de développement.

public function registerBundles()
{
    $bundles = array(
        …
    );

    if (in_array($this->getEnvironment(), array('dev', 'test'))) {
        $bundles[] = new Symfony\Bundle\TwigBundle\TwigBundle();

        $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
        $bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle();
        $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle();
    }

    return $bundles;
}

De cette manière, Twig sera désactivé pour l'environnement de production.

Ensuite, nous allons supprimer la configuration de Twig qui se trouve dans app/config/config.yml et l'ajouter dans app/config/config_dev.yml.

# app/config/config_dev.yml
twig:
    debug:            "%kernel.debug%"
    strict_variables: "%kernel.debug%"

Pour finir, vous devez indiquer au SensioFrameworkExtraBundle (si vous l'utilisez) que votre moteur de template n'est plus Twig mais qu'il s'agit du moteur PHP.

Pour rappel, le SensioFrameworkExtraBundle est un bundle développé par Sensio (il peut donc être considéré comme une source sûre) et est par défaut activé dans Symfony. Son objectif ? Mettre en place des outils dev-friendly comme les annotations @Route, @Template, @Method@Cache et@Security. La liste des features proposés est disponible sur la page Symfony dédiée.

Benchmark

Personnellement, lorsque je lis un article sur l'optimisation d'un composant j'aime bien avoir des preuves de la véracité des affirmations avancées. Pas de soucis, j'ai effectué un petit siege sur ma machine dans des conditions similaires et comparé le nombre de « hits » réalisés.

Avant chaque siège, j'ai effectué un cache:clear et un cache:warmup pour mettre en cache un peu de code et attaquer immédiatement dans le vif du sujet. J'ai bien évidemment testé en appelant l'environnement de production, et en appelant une page retournant un JSON. Le siège a été effectué en lancant 50 threads concurrents pendant 60 secondes (siege -b -c 50 -t60s url).

 

 

[caption id="attachment_739" align="aligncenter" width="605"]Benchmark - Symfony2 sans TwigBundle Benchmark - Symfony2 sans TwigBundle[/caption]

Je pense que le constat est sans appel, ne vous fiez pas à la taille des barres mais plutôt aux nombres de transactions. Avec TwigBundle, notre API a répondu à 1154 requêtes alors que sans TwigBundle, ou plutôt en le désactivant, notre code a répondu à 1258 transactions dans le même temps imparti.

Avec un bref calcul, cela nous donne un coefficient de 1.09 (1258/1154). Notre API est donc 9% plus rapide sans TwigBundle. Le peu de changement à effectuer comparé au gain réalisé est important. Dès lors qu'on ne sert pas de ce module, il y aurait donc peu d'intérêt de s'en passer.

Conclusion

Utiliser Symfony pour réaliser une API peut être un choix tout à fait sensé. De plus, le fait de désactiver Twig pour l'API n'empêche pas d'utiliser Twig. Ce dernier sera toujours installé avec l'installation de Symfony et vous pourrez tout de même générer des templates simples pour des parties particulières.

Commentaires

Photo de AMANI auteur du commentaire

AMANI

Il y a 8 ans

Bonjour à toute d'équipe de dev,

Je voudrais avoir la réponse à une interrogation si je peux avoir votre avis.

Je souhaiterais développer une application symfony frontend/backend.

Au niveau architectural, bien sur le MVC.

1/ Intégrer une Api antre le frontend et le backend à 100% est il un choix judicieux ?

2/Le frontend pourra t il bénéficier de toutes les ressources ou fonctionalités du backend ?

Cordialement



  • Couverture de l'article Retour sur le Meet-up Python du 30 juin 2025
    Retour sur le Meet-up Python du 30 juin 2025

    Il y a 3 mois

    Ce lundi 30 juin 2025 nous accueillions la branche lyonnaise de l'AFPy dans nos locaux pour un meetup autour du langage Python. Malgré les fortes températures, une trentaine de personnes ont répondu présentes pour ce moment de convivialité et d'échange.

  • Couverture de l'article Figma Make : enfin une passerelle prometteuse entre design et code grâce à l'IA
    Figma Make : enfin une passerelle prometteuse entre design et code grâce à l'IA

    Il y a 3 mois

    Depuis quelques années, les outils d'IA pour générer des intégrations d'interfaces à partir de maquettes fleurissent. On en a testé plusieurs chez WanadevDigital : de Locofy à Uizard, en passant par Framer AI. Tous ont leurs qualités, mais jusqu’ici, il manquait un vrai pont stable entre les intentions du designer et la réalité du code front.

    L’arrivée de Figma Make change la donne. Et si je devais résumer son impact en une phrase : ça fonctionne, et ça fonctionne pour tout le monde, designers, développeurs et intégrateurs !

  • Couverture de l'article Maîtriser la traduction (i18n) dans un projet web - Partie 2 : Conseils pour une localisation gérable et évolutive
    Maîtriser la traduction (i18n) dans un projet web - Partie 2 : Conseils pour une localisation gérable et évolutive

    Il y a 6 mois

    Dans la partie 1, nous nous sommes concentrés sur la mise en place d'une base solide pour la gestion des traductions dans un projet Vue. Maintenant que votre système de traduction est opérationnel, il est temps d'examiner de plus près comment structurer, gérer et faire évoluer vos fichiers de traduction de manière efficace.

    Cette partie couvrira les bonnes pratiques que nous utilisons chez Wanadev pour créer des clés de traduction maintenables, éviter les pièges courants et garantir que vos fichiers de traduction restent propres et évolutifs au fur et à mesure que votre projet grandit.

  • Couverture de l'article Maîtriser la traduction (i18n) dans un projet web - Partie 1 : Configurer proprement
    Maîtriser la traduction (i18n) dans un projet web - Partie 1 : Configurer proprement

    Il y a 6 mois

    Mettre en place l'internationalisation (i18n) dans un projet web peut sembler simple. Cependant, de nombreux projets se retrouvent avec des configurations de traduction mal gérées, difficiles à maintenir ou à faire évoluer à mesure que l'application grandit. Une stratégie i18n robuste est essentielle pour offrir une expérience utilisateur fluide dans plusieurs langues.

    Je vous décris ici, les pratiques que nous avons établies chez Wanadev au fil des années d'expérience pour mettre en œuvre et gérer les traductions dans les projets Vue. Bien que les exemples soient spécifiques à Vue, la plupart de ces pratiques peuvent être appliquées à n'importe quel framework.

  • Couverture de l'article Bien choisir sa typographie : quelques bases pour un message clair
    Bien choisir sa typographie : quelques bases pour un message clair
    Méthodologie

    Il y a 11 mois

    On n'écrit pas "Je t'aime" comme "Je te hais" ! Cette petite phrase résume bien ma problématique : quand on doit délivrer un message, la compréhension de ce dernier ne se fait pas uniquement par la lecture simple du texte, mais aussi par sa mise en forme. Et de cette mise en forme dépend la bonne compréhension du message. Dans cet article, nous allons nous pencher sur l’histoire et les familles de typographies dans le but de sensibiliser sur l’importance des choix de typographies dans la communication. Nous verrons ensuite quelques astuces pour bien sélectionner sa typographie et mettre en forme son message.

  • Couverture de l'article Les solutions CPQ sont-elles accessibles à toutes les entreprises ?
    Les solutions CPQ sont-elles accessibles à toutes les entreprises ?
    Méthodologie

    Il y a 12 mois

    Le CPQ (Configure, Price, Quote) est un outil essentiel pour les entreprises cherchant à optimiser leurs processus de vente. Il permet aux équipes commerciales de configurer rapidement et facilement des produits ou services complexes en fonction des besoins spécifiques des clients, tout en garantissant la cohérence des prix. Grâce au CPQ, les vendeurs peuvent établir des devis précis et personnalisés en temps réel, tout en tenant compte des remises, des promotions ou des ajustements spécifiques. Aujourd'hui les CPQ tirent majoritairement parti de la 3D pour proposer une visualisation de produit plus réaliste et complète.