Sous requêtes et fonctions Twig

Une question qui revient souvent lors de la création d’un template TWIG : « comment faire appel à telle ou telle fonction de mon controller/service? »

La réponse que l’on trouve souvent à cette question est de faire une sous-requête :

Cette solution est bien pratique si l’on veut rendre un template. Mais que faire lorsque l’ont veut simplement retourner une string? ou un tableau? Par exemple pour afficher le nom de l’utilisateur connecté, sa date de dernière connexion, etc. De plus, une sous requête est plutôt gourmande en ressources (elle fait appel à toute la stack Symfony à chaque fois!). Donc si vous multipliez les sous-requêtes vous allez plomber votre application.

Dans ce cas, la solution est d’utiliser une fonction twig.

Les gros avantages des fonctions twig sont de pouvoir retourner juste ce dont vous avez besoin et d’être plus légères que des sous-requêtes. Vous pouvez directement faire appel à n’importe quelle fonction de votre controller ou autre service et récupérer le résultat dans votre template.

Petit exemple :

Pour afficher une liste d’articles similaires à celui affiché, vous avez une fonction qui va récupérer dans votre base (ou via l’API eZ par exemple) des articles similaires selon certains critères.

Donc plutôt que d’appeler cette fonciton dans une action d’un controller et retourner une objet Response, on va l’appeler dans une fonction twig :

Vous pourrez donc appeler la fonction {{ get_related(currentArticle.id) }} dans votre template pour récupérer votre liste d’articles associés. Il ne vous reste plus qu’à parcourir ce tableau et l’afficher comme vous voulez.

Un autre truc cool est que les fonctions twig peuvent retourner directement du HTML (à utiliser avec modération 😉 ). Pour cela il faut juste modifier la déclaration de la fonction :

Bien entendu ce n’est pas toujours possible de se passer d’une sous requête mais en réfléchissant un peu plus à ce que vous voulez implémenter il est souvent possible de faire une petite fonction twig à la place 😉 Votre application ne s’en portera que mieux!

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *