Comment var_dump variables dans les modèles Twig?

156

Voir le motif de calque où vous ne présentez que ce qui vous a été donné est bien et tout, mais comment savoir ce qui est disponible? Existe-t-il une fonctionnalité «lister toutes les variables définies» dans TWIG? Existe-t-il un moyen de vider une variable?

La solution que j'ai trouvée en la recherchant était de définir une fonction dans laquelle je peux utiliser mes outils de débogage php existants en injectant une fonction , mais toutes les références que j'ai trouvées incluent ces deux belles lignes de code, mais nulle part il n'est spécifié où place les. Étant donné qu'ils ont besoin d'une variable $ loader définie, j'ai essayé /app/config/autoload.php mais le $ loader était du mauvais type. Où dois-je placer le code php pour ajouter une fonction twig?

Alexander Morland
la source

Réponses:

251

Depuis Twig 1.5, la bonne réponse est d'utiliser la fonction de vidage. Il est entièrement documenté dans la documentation Twig . Voici la documentation pour activer cela dans Symfony2.

{{ dump(user) }}
Icode4food
la source
3
BTW, soyez prudent lorsque vous
videz
14
Lorsque j'utilise {{ dump() }}pour vider toutes les variables, cela renvoie une page vierge. Existe-t-il un autre moyen de vider une variable?
Jerry Pham
J'utilise la dernière version de Symfony 2.5 et j'ai activé le mode d'installation et de débogage config.yml et config_dev.yml lors du chargement du noyau pour l'environnement de développement. J'ai essayé les autres méthodes manuelles mentionnées par Morland ci-dessous. Dans tous les cas, j'obtiens également une page vierge lorsque le vidage est utilisé. Et pas de décharge.
Chadwick Meyer
Si vous obtenez une page vierge avec et sans le dump, ce dumpn'est évidemment pas le problème. Je suggérerais de poster une nouvelle question si vous ne pouvez pas le comprendre autrement.
Icode4food
1
J'obtiens l'erreur suivante: `Twig_Error_Syntax - Fonction" dump "inconnue`
Pathros
28

Vous pouvez utiliser la debugbalise, qui est documentée ici .

{% debug expression.varname %}

Edit: Depuis Twig 1.5, cela a été abandonné et remplacé par la nouvelle dumpfonction (notez que c'est maintenant une fonction et non plus une balise). Voir aussi: La réponse acceptée ci-dessus.

igorw
la source
7
Si vous obtenez une erreur en disant Unknown tag name "debug", étendre votre configuration (soit dans le monde config.ymlou config_dev.yml) comme décrit ici: github.com/symfony/symfony-docs/issues/455#issuecomment-1884861
grippe
5
Cette méthode est déconseillée à partir de Twig 1.5.
Icode4food
4
Ajout d'une note d'obsolescence à la réponse.
igorw
17

Donc je l'ai fait fonctionner, en partie un peu hackish:

  1. mettre twig: debug: 1enapp/config/config.yml
  2. Ajoutez ceci à config_dev.yml

    services:
        debug.twig.extension:
            class: Twig_Extensions_Extension_Debug
            tags: [{ name: 'twig.extension' }]
    
  3. sudo rm -fr app/cache/dev

  4. Pour utiliser ma propre fonction de débogage au lieu de print_r(), j'ai ouvert vendor/twig-extensions/lib/Twig/Extensions/Node/Debug.phpet changé print_r(end(

PS. J'aimerais toujours savoir comment / où récupérer l'environnement $ twig pour ajouter des filtres et des extensions.

Alexander Morland
la source
1
btw: pour vider le cache, vous pouvez utiliser l'outil de console ( stackoverflow.com/questions/6789950/… )
Raffael
y a-t-il un avantage à faire cela?
Alexander Morland
c'est plus simple ... si vous ne connaissez pas l'outil de la console, je vous recommande de le vérifier
Raffael
3
Vous ne devriez pas avoir à définir twig: debug: 1car il hérite de ces informations de l'environnement de votre contrôleur frontal. Sinon, vous pourriez finir par afficher involontairement des informations de débogage dans votre environnement de production. Tant que vous travaillez dans l'environnement de développement, il est activé par défaut et désactivé dans votre environnement de production.
grippe
1
Ceci est obsolète depuis Twig 1.5. Voir autre réponse: stackoverflow.com/a/10080404/107768
Icode4food
14

Si vous utilisez Twig dans votre application en tant que composant, vous pouvez le faire:

$twig = new Twig_Environment($loader, array(
    'autoescape' => false
));

$twig->addFilter('var_dump', new Twig_Filter_Function('var_dump'));

Puis dans vos modèles:

{{ my_variable | var_dump }}
Julio
la source
Où les placer / les remplacer $twig = new Twig_Environment($loader, array(...?
PolGraphic
5

Si vous utilisez Twig en tant que composant autonome, voici un exemple d'activation du débogage car il est peu probable que le vidage (variable) fonctionne directement.

Autonome

Cela a été trouvé sur le lien fourni par icode4food

$twig = new Twig_Environment($loader, array(
    'debug' => true,
    // ...
));
$twig->addExtension(new Twig_Extension_Debug());

Silex

$app->register(new \Silex\Provider\TwigServiceProvider(), array(
    'debug' => true,
    'twig.path' => __DIR__.'/views'
));
Carlton
la source
5

Videz toutes les variables personnalisées:

<h1>Variables passed to the view:</h1>
{% for key, value in _context %}
    {% if key starts with '_' %}
    {% else %}
        <pre style="background: #eee">{{ key }}</pre>
        {{ dump(value) }}
    {% endif %}
{% endfor %}

Vous pouvez utiliser mon plugin qui le fera pour vous (et formatera joliment la sortie):

Barre de vidage des brindilles

kapitalny
la source
bel extrait. Merci. cela fonctionne pour moi si je remplace dump (valeur) par valeur | var_dump
matthijs koevoets
3

{{ dump() }} ne fonctionne pas pour moi. PHPs'étouffe. Niveau de nidification trop profond je suppose.

Tout ce dont vous avez vraiment besoin pour les debugmodèles Twig si vous utilisez debuggerest une extension comme celle-ci .

Ensuite, il suffit de définir un point d'arrêt et d'appeler {{ inspect() }}là où vous en avez besoin. Vous obtenez les mêmes informations qu'avec {{ dump() }}mais dans votre débogueur.

Christian Fecteau
la source
3

Depuis Symfony> = 2.6, il existe un joli composant VarDumper , mais il n'est pas utilisé par la dump()fonction de Twig .

Pour l'écraser, nous pouvons créer une extension:

Dans l'implémentation suivante, n'oubliez pas de remplacer les espaces de noms.

Fuz/AppBundle/Resources/config/services.yml

parameters:
   # ...
   app.twig.debug_extension.class: Fuz\AppBundle\Twig\Extension\DebugExtension

services:
   # ...
   app.twig.debug_extension:
       class: %app.twig.debug_extension.class%
       arguments: []
       tags:
           - { name: twig.extension }

Fuz/AppBundle/Twig/Extension/DebugExtension.php

<?php

namespace Fuz\AppBundle\Twig\Extension;

class DebugExtension extends \Twig_Extension
{

    public function getFunctions()
    {
        return array (
              new \Twig_SimpleFunction('dump', array('Symfony\Component\VarDumper\VarDumper', 'dump')),
        );
    }

    public function getName()
    {
        return 'FuzAppBundle:Debug';
    }

}
Alain Tiemblo
la source
Oui, je cherchais ceci :)
Tim Strijdhorst
2

La recette complète ici pour une référence plus rapide (notez que toutes les étapes sont obligatoires):

1) lors de l'instanciation de Twig, passez l'option de débogage

$twig = new Twig_Environment(
$loader, ['debug'=>true, 'cache'=>false, /*other options */]
);

2) ajoutez l'extension de débogage

$twig->addExtension(new \Twig_Extension_Debug());

3) Utilisez-le comme @Hazarapet Tunanyan l'a souligné

{{ dump(MyVar) }}

ou

{{ dump() }}

ou

{{ dump(MyObject.MyPropertyName) }}
Tudor Ilisoi
la source
1

Pour le débogage des modèles Twig, vous pouvez utiliser l' instruction de débogage .

entrez la description de l'image ici

Là, vous pouvez définir explicitement le paramètre de débogage.

Raffael
la source
J'obtiens 'Unknown tag name "debug"' avec et sans réglage de twig.debug: true
Alexander Morland
si vous travaillez en mode prod, vous devez d'abord vider le cache
Raffael
@AlexanderMorland Bonjour Alex, vous devez étendre votre configuration comme décrit ici: github.com/symfony/symfony-docs/issues/455#issuecomment-1884861 pour éliminer l' Unknown tag name "debug"erreur.
grippe
1

Vous pouvez modifier

/vendor/twig/twig/lib/Twig/Extension/Debug.php

et changez les the var_dump()fonctions en\Doctrine\Common\Util\Debug::dump()

user3420644
la source
3
Il n'est pas recommandé de modifier quoi que ce soit sous le dossier du fournisseur.
Luis Milanese
1

Comme la plupart des bons programmeurs PHP aiment utiliser XDebug pour parcourir le code en cours d'exécution et regarder les variables changer en temps réel, l'utilisation dump()ressemble à un retour au mauvais vieux temps.

C'est pourquoi j'ai créé une extension Twig Debug et l'ai mise sur Github.

https://github.com/delboy1978uk/twig-debug

composer require delboy1978uk/twig-debug

Ajoutez ensuite l'extension. Si vous n'utilisez pas Symfony, comme ceci:

<?php

use Del\Twig\DebugExtension;

/** @var $twig Twig_Environment */
$twig->addExtension(new DebugExtension());

Si vous l'êtes, comme ceci dans la configuration YAML de vos services:

twig_debugger:
    class: Del\Twig\DebugExtension
    tags:
        - { name: twig.extension }

Une fois inscrit, vous pouvez maintenant le faire n'importe où dans un modèle de brindille:

{{ breakpoint() }}

Maintenant, vous pouvez utiliser XDebug, l'exécution s'arrêtera et vous pouvez voir toutes les propriétés du contexte et de l'environnement.

S'amuser! :-RÉ

delboy1978uk
la source
0

vous pouvez utiliser la fonction de vidage et l'imprimer comme ceci

{{ dump(MyVar) }}

mais il y a aussi une bonne chose, si vous ne définissez aucun argument pour la fonction de vidage, elle imprimera toutes les variables sont disponibles , comme

{{ dump() }}
Hazarapet Tunanyan
la source
Oui, cela fonctionne, mais vous devez vous assurer que le débogage est activé dans les options lors de l'instanciation de Twig
Tudor Ilisoi
0

Si vous êtes dans un environnement où vous ne pouvez pas utiliser la dumpfonction (ex: opencart), vous pouvez essayer:

{{ my_variable | json_encode(constant('JSON_PRETTY_PRINT')) }}
redochka
la source