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

AMANI

Il y a 5 ans

Répondre

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



  • Tests automatiques fonctionnels d’applications 2D/3D

    Il y a 9 mois

    Comme nous le disions dans cet article, l’automatisation des tests dans le développement logiciel est indispensable : dès lors qu’une application commence à avoir un minimum d’importance, les tests automatiques permettront de gagner énormément de temps en évitant de reproduire ad vitam æternam les mêmes tests manuels, et éviteront beaucoup de régressions. Dans cet article, nous allons présenter différents types de tests automatiques dans le cadre plus spécifique d’applications 2D/3D, puisque c’est ce que nous faisons ! Cela va du test basique qui clique sur 3 boutons aux tests de plusieurs minutes reproduisant les actions comme un véritable utilisateur. Accrochez-vous, c’est parti !

  • Configurateur web à l'abonnement : forces et faiblesses

    Il y a 10 mois

    Aujourd’hui, si vous cherchez à mettre en place un configurateur sur votre site, deux grandes possibilités s'offrent à vous : les solutions par abonnement (du type SaaS) ou le développement sur mesure. Au premier abord, les solutions semblent proches, mais les enjeux sur le long terme eux, sont bien différents.

  • Les frameworks front, tous les mêmes !
    Méthodologie

    Il y a 11 mois

    C'est une phrase que j'ai osé sortir un jour dans la salle de pause de Wanadev. Je ne sais plus exactement avec quel collègue je discutais, j’essayais de le rassurer, il possédait déjà une certaine expérience avec React et allait devoir, en arrivant sur le projet sur lequel je travaille, se mettre à Vue.
    Il a malheureusement fallu qu'un autre collègue de passage nous entende pour ne pas trouver la conversation inintéressante et suggérer que j'en fasse un petit talk pour nos réu du lundi. Et, de fil en aiguille, me voilà en train d'en faire un article de blog. Comme quoi, note pour moi-même, il faut toujours se méfier des discussions dans les salles de pause.

  • [NOVEMBRE 2021] C'est la gazette de Wanadev !
    Méthodologie

    Il y a 1 an

    Retrouvez ici les informations et actus du mois de novembre de l'Agence! Au programme de cette édition : découvrez le configurateur de fenêtre développé pour Caseo, recontrez François Deleglise, notre directeur communication et un nouvel espace de jeu pour les professionnels du loisir en VR. Bonne lecture !

  • Un peu d'ingérence dans votre infogérance ?
    Méthodologie

    Il y a 2 ans

    Même si les impacts sont difficiles à mesurer, on peut dire qu’il a eu un avant et un après incident OVH. Sans épiloguer sur l'incendie du 5 mars 2021 dernier, un petit vent de panique a soufflé sur les milliers de clients découvrant les problématiques de sécurisation des données. Les réactions à chaud d'une partie des utilisateurs (touchés ou non) montrent la méconnaissance et l'incompréhension qui existent dans les offres d'hébergement. Qui est responsable ? Qui fait quoi ? Comment vérifier mon offre ? Voici quelques clés de compréhension.

  • Améliorer la qualité avec les tests et la review

    Il y a 2 ans

    L’importance des tests et de la revue de code dans le cadre du développement logiciel est parfois négligée ou passée au second plan. Cet article a pour but de montrer que les tests logiciels constituent une étape cruciale qu’il faut considérer avec beaucoup de rigueur.