Twig : render controller, le faux bon ami

Symfony2: Le Helper Render Pour Appeller Une Action Depuis Une Vue Twig

Lors du stand’up du lundi matin, un des développeurs de l’entreprise qui était en phase d’optimisation d’une plateforme fait en Symfony2, a eu la bonne idée de nous expliquer le fonctionnement de cette fonctionnalité Twig dont vous abusez probablement. Le render controller !

{% render %} sert à afficher la réponse d’une action dans un template Twig. C’est surtout utile quand on veut afficher du contenu dynamique dans toutes les pages de notre application.

Exemple d’utilisation: Afficher le nombre des utilisateurs connectés.

Créer une action onlineUsersAction()

Cette fonction récupérera les utilisateurs et calculera leur nombre.

Avez-vous compris ?

Cela est simple, comme on dit… C’est comme le Port-Salut, c’est écrit dessus ! Ou presque… En tout cas, le render permet de générer le rendu de quelque chose. En l’occurrence, le problème ici, c’est lorsqu’on essaye d’afficher le rendu d’un controller dans un template.

Combo : Render Controller

Le render controller correspond comme noté au paragraphe précédent afficher le rendu d’un controller. Là où l’utilisation de ce type de code devient une mauvaise pratique, c’est que l’appel du contrôleur fait appel à tout le workflow Symfony. Il y a alors le double d’objet à générer.

{{ render(controller(‘NamespaceNameBundle:Controller:Action’, {})) }}

Vous pouvez rapidement comprendre qu’il y a une redondance de code énorme, une redondance de variable énorme comme le container, la variable à tout faire.

Benchmark

J’ai récemment pu vérifier et je vous propose un petit graphe pour illustrer mes propos.

Dans un premier cas, les pages générés intégraient constamment un render controller. Cela était constamment appelé. J’ai testé le temps d’exécution de ces pages « lites » pour avoir des temps de réponse entre 190 et 200ms. Je vous l’accorde, il s’agit de petit page.

J’ai ensuite remplacer mes render controller par un appel dans un listener (onKernelRequest). De cette manière, un seul contrôleur est appelé. J’ai ensuite testé et les temps de réponses avaient drastiquement diminués ! Entre 110 et 140ms. Bien évidemment, sur des temps aussi faibles, difficiles de voir à vue d’œil la différence, mais sur un projet conséquent, on ressent rapidement la différence. Ici si on fait un rapide calcul, les gains sont de l’ordre 25 à 45%.

Twig Benchmark : render controllerTwig Benchmark : render controller

Conclusion

Même si c’est chiffre sont à prendre avec précaution, on remarque que le même rendu est nettement plus rapide lorsqu’on évite le render controller. Dans de nombreux cas, il s’agit d’une solution de faciliter, et mettre un manager en plus est tout aussi simple.

Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s