Come var_dump variabili nei modelli di ramoscello?


156

Visualizza lo schema dei livelli in cui presenti solo ciò che ti è stato dato va bene e tutto, ma come fai a sapere cosa è disponibile? Esiste una funzionalità "elenca tutte le variabili definite" in TWIG? C'è un modo per scaricare una variabile?

La soluzione che ho trovato ricercando era di definire una funzione in cui posso usare i miei strumenti php di debug esistenti per l'iniezione di una funzione , ma tutti i riferimenti che ho trovato a che include queste belle due righe di codice, ma da nessuna parte è specificato dove posizionali. Andando dal fatto che hanno bisogno di una variabile $ loader definita, ho provato /app/config/autoload.php ma il $ loader era del tipo sbagliato. Dove inserisco il codice php per aggiungere una funzione ramoscello?

Risposte:


251

A partire da Twig 1.5, la risposta corretta è utilizzare la funzione dump. È completamente documentato nella documentazione di Twig . Ecco la documentazione per abilitare questo all'interno di Symfony2.

{{ dump(user) }}

3
A proposito, fai attenzione quando scarichi oggetti con mappatura relazionale
pleerock

14
Quando uso {{ dump() }}per scaricare tutte le variabili, restituisce una pagina vuota. C'è un altro modo per scaricare una variabile?
Jerry Pham,

Sto usando l'ultima versione di Symfony 2.5 e ho attivato la configurazione config.yml e config_dev.yml e la modalità debug quando si carica il kernel per l'ambiente dev. Ho provato gli altri metodi manuali menzionati da Morland di seguito. Ad ogni modo, ottengo anche una pagina vuota quando viene utilizzato il dump. E nessuna discarica.
Chadwick Meyer,

Se ottieni una pagina vuota con e senza il dump, ovviamente dumpnon è il problema. Suggerirei di pubblicare una nuova domanda se non riesci a capirlo diversamente.
Icode4food

1
Ottengo il seguente errore: `Twig_Error_Syntax - Funzione" dump "sconosciuta`
Pathros

28

Puoi usare il debugtag, che è documentato qui .

{% debug expression.varname %}

Modifica: A partire da Twig 1.5, questo è stato deprecato e sostituito con la nuova dumpfunzione (nota, ora è una funzione e non è più un tag). Vedi anche: la risposta accettata sopra.


7
Se ricevi un errore che dice Unknown tag name "debug", estendi la tua configurazione (nel globale config.ymlo config_dev.yml) come descritto qui: github.com/symfony/symfony-docs/issues/455#issuecomment-1884861
influenza

5
Questo metodo è obsoleto a partire da Twig 1.5.
Icode4food,

4
Aggiunta di una nota di ammortamento alla risposta.
venerdì

17

Quindi l'ho fatto funzionare, in parte un po 'hacker:

  1. Situato twig: debug: 1inapp/config/config.yml
  2. Aggiungi questo a config_dev.yml

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

  4. Per utilizzare la mia funzione di debug anziché print_r(), ho aperto vendor/twig-extensions/lib/Twig/Extensions/Node/Debug.phpe modificato print_r(ind(

PS. Mi piacerebbe ancora sapere come / dove prendere l'ambiente $ twig per aggiungere filtri ed estensioni.


1
btw: per cancellare la cache è possibile utilizzare lo strumento console ( stackoverflow.com/questions/6789950/… )
Raffael

c'è qualche vantaggio nel farlo?
Alexander Morland,

è più semplice ... se non conosci lo strumento console, ti consiglio di dare un'occhiata
Raffael,

3
Non dovresti impostare twig: debug: 1perché eredita queste informazioni dall'ambiente del tuo front controller. Altrimenti potresti finire con l'invio involontario di informazioni di debug nel tuo ambiente di produzione. Finché lavori nell'ambiente di sviluppo è abilitato per impostazione predefinita ed è disabilitato nel tuo ambiente di produzione.
influenza

1
Questo è obsoleto a partire da Twig 1.5. Vedere altra risposta: stackoverflow.com/a/10080404/107768
Icode4food

14

Se stai usando Twig nella tua applicazione come componente puoi farlo:

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

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

Quindi nei tuoi modelli:

{{ my_variable | var_dump }}

Dove posizionarli / sostituirli $twig = new Twig_Environment($loader, array(...?
PolGraphic,

5

Se si utilizza Twig come componente autonomo, ecco alcuni esempi su come abilitare il debug in quanto è improbabile che la funzione dump (variabile) funzioni immediatamente

Indipendente, autonomo

Questo è stato trovato sul link fornito da 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'
));

5

Scarica tutte le variabili personalizzate:

<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 %}

Puoi usare il mio plugin che lo farà per te (e formatterà l'output):

Twig Dump Bar


bel frammento. grazie. questo funziona per me se sostituisco dump (valore) con valore | var_dump
matthijs koevoets,

3

{{ dump() }}non funziona per me. PHPstrozzatori. Livello di nidificazione troppo profondo, immagino.

Tutto ciò di cui hai veramente bisogno per i debugtemplate di Twig se stai usando a debuggerè un'estensione come questa .

Quindi si tratta solo di impostare un breakpoint e chiamare {{ inspect() }}ovunque ne abbiate bisogno. Ottieni le stesse informazioni di con {{ dump() }}ma nel tuo debugger.


3

Dato che Symfony> = 2.6, esiste un bel componente VarDumper , ma non è usato dalla dump()funzione di Twig .

Per sovrascriverlo, possiamo creare un'estensione:

Nella seguente implementazione, non dimenticare di sostituire gli spazi dei nomi.

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';
    }

}

Sì, stavo cercando questo :)
Tim Strijdhorst,

2

La ricetta completa qui per un riferimento più rapido (nota che tutti i passaggi sono obbligatori):

1) quando si crea un'istanza di Twig, passare l'opzione di debug

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

2) aggiungi l'estensione di debug

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

3) Usalo come ha sottolineato @Hazarapet Tunanyan

{{ dump(MyVar) }}

o

{{ dump() }}

o

{{ dump(MyObject.MyPropertyName) }}

1

Per il debug dei modelli Twig è possibile utilizzare l' istruzione debug .

inserisci qui la descrizione dell'immagine

Lì puoi impostare esplicitamente l'impostazione di debug.


Ottengo "Nome tag sconosciuto" debug "con e senza l'impostazione di twig.debug: true
Alexander Morland,

se stai lavorando in modalità prod, devi prima svuotare la cache
Raffael,

@AlexanderMorland Ciao Alex, devi estendere la tua configurazione come descritto qui: github.com/symfony/symfony-docs/issues/455#issuecomment-1884861 per eliminare l' Unknown tag name "debug"errore.
influenza

1

Puoi modificare

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

e cambia le the var_dump()funzioni in\Doctrine\Common\Util\Debug::dump()


3
Si consiglia vivamente di non modificare nulla nella cartella del fornitore.
Luis Milanese,

1

Poiché la maggior parte dei bravi programmatori PHP preferisce utilizzare XDebug per scorrere il codice in esecuzione e guardare le variabili cambiare in tempo reale, usando dump() sembra un passo indietro ai vecchi tempi.

Ecco perché ho creato un'estensione per il debug di Twig e l'ho messa su Github.

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

composer require delboy1978uk/twig-debug

Quindi aggiungere l'estensione. Se non stai usando Symfony, in questo modo:

<?php

use Del\Twig\DebugExtension;

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

Se lo sei, in questo modo nella tua configurazione YAML dei tuoi servizi:

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

Una volta registrato, ora puoi farlo ovunque in un modello di ramoscello:

{{ breakpoint() }}

Ora puoi usare XDebug, l'esecuzione verrà messa in pausa e puoi vedere tutte le proprietà sia del contesto che dell'ambiente.

Divertiti! :-D


0

puoi usare la funzione dump e stamparla in questo modo

{{ dump(MyVar) }}

ma c'è anche una cosa carina, se non imposti alcun argomento sulla funzione dump, stamperà tutte le variabili disponibili , come

{{ dump() }}

Sì, funziona, ma è necessario assicurarsi che il debug sia abilitato nelle opzioni quando si crea un'istanza di Twig
Tudor Ilisoi,

0

Se ti trovi in ​​un ambiente in cui non puoi usare la dumpfunzione (es: opencart), puoi provare:

{{ my_variable | json_encode(constant('JSON_PRETTY_PRINT')) }}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.