Wie var_dump Variablen in Zweigvorlagen?


156

Das Anzeigen von Ebenenmustern, in denen Sie nur das präsentieren, was Ihnen gegeben wurde, ist in Ordnung, aber woher wissen Sie, was verfügbar ist? Gibt es in TWIG die Funktion "Alle definierten Variablen auflisten"? Gibt es eine Möglichkeit, eine Variable zu sichern?

Die Lösung, die ich bei der Suche gefunden habe, bestand darin, eine Funktion zu definieren, in der ich meine vorhandenen PHP-Debug-Tools durch Einfügen einer Funktion verwenden kann. Alle Verweise, die ich darauf gefunden habe, enthalten diese schönen zwei Codezeilen, aber nirgendwo ist angegeben, wohin platziere sie. Aufgrund der Tatsache, dass eine $ loader- Variable definiert werden muss, habe ich /app/config/autoload.php ausprobiert, aber der $ loader dort war die falsche Art. Wo platziere ich den PHP-Code zum Hinzufügen einer Zweigfunktion?

Antworten:


251

Ab Twig 1.5 ist die richtige Antwort die Verwendung der Dump-Funktion. Es ist vollständig in der Twig-Dokumentation dokumentiert . Hier ist die Dokumentation, um dies in Symfony2 zu aktivieren.

{{ dump(user) }}

3
Übrigens, seien Sie vorsichtig, wenn Sie Objekte mit relationaler Zuordnung
sichern

14
Wenn ich {{ dump() }}alle Variablen speichere, wird eine leere Seite zurückgegeben. Gibt es eine andere Möglichkeit, eine Variable zu sichern?
Jerry Pham

Ich verwende die neueste Version von Symfony 2.5 und habe den Setup- und Debug-Modus config.yml und config_dev.yml aktiviert, wenn der Kernel für die Entwicklungsumgebung geladen wird. Ich habe die anderen von Morland unten erwähnten manuellen Methoden ausprobiert. In beiden Fällen wird auch eine leere Seite angezeigt, wenn der Speicherauszug verwendet wird. Und keine Müllkippe.
Chadwick Meyer

Wenn Sie eine leere Seite mit und ohne erhalten dump, ist dies offensichtlich dumpnicht das Problem. Ich würde vorschlagen, eine neue Frage zu stellen, wenn Sie es nicht anders herausfinden können.
Icode4food

1
Ich erhalte die folgende Fehlermeldung: `Twig_Error_Syntax - Unbekannte" Dump "-Funktion`
Pathros

28

Sie können das debugTag verwenden, das hier dokumentiert ist .

{% debug expression.varname %}

Bearbeiten: Ab Twig 1.5 ist dies veraltet und wurde durch die neue dumpFunktion ersetzt (Hinweis, es ist jetzt eine Funktion und kein Tag mehr). Siehe auch: Die oben akzeptierte Antwort.


7
Wenn Sie eine Fehlermeldung erhalten Unknown tag name "debug", erweitern Sie Ihre Konfiguration (entweder global config.ymloder config_dev.yml) wie hier beschrieben: github.com/symfony/symfony-docs/issues/455#issuecomment-1884861
Grippe

5
Diese Methode ist ab Twig 1.5 veraltet.
Icode4food

4
Der Antwort wurde ein Verfallshinweis hinzugefügt.
igorw

17

Also habe ich es zum Laufen gebracht, teilweise ein bisschen hackisch:

  1. Setzen Sie twig: debug: 1einapp/config/config.yml
  2. Fügen Sie dies zu config_dev.yml hinzu

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

  4. Zu meiner eigenen Debug - Funktion zu verwenden , anstatt print_r(), ich öffnete vendor/twig-extensions/lib/Twig/Extensions/Node/Debug.phpund geändert , print_r(umd(

PS. Ich würde immer noch gerne wissen, wie / wo ich die $ twig-Umgebung nutzen kann, um Filter und Erweiterungen hinzuzufügen.


1
Übrigens: Zum Löschen des Caches können Sie das Konsolentool ( stackoverflow.com/questions/6789950/… ) verwenden
Raffael

Gibt es einen Vorteil dafür?
Alexander Morland

Es ist einfacher ... Wenn Sie das Konsolentool nicht kennen, empfehle ich Ihnen, es sich
Raffael

3
Sie sollten nicht festlegen müssen, twig: debug: 1da diese Informationen von der Umgebung Ihres Frontcontrollers übernommen werden. Andernfalls könnten Sie unbeabsichtigt Debug-Informationen in Ihrer Produktumgebung ausgeben. Solange Sie in der Entwicklungsumgebung arbeiten, ist diese standardmäßig aktiviert und in Ihrer Produktumgebung deaktiviert.
Grippe

1
Dies ist ab Twig 1.5 veraltet. Siehe andere Antwort: stackoverflow.com/a/10080404/107768
Icode4food

14

Wenn Sie Twig in Ihrer Anwendung als Komponente verwenden , können Sie Folgendes tun:

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

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

Dann in Ihren Vorlagen:

{{ my_variable | var_dump }}

Wo diese platzieren / ersetzen $twig = new Twig_Environment($loader, array(...?
PolGraphic

5

Wenn Sie Twig als eigenständige Komponente verwenden, finden Sie hier ein Beispiel für das Aktivieren des Debuggens, da es unwahrscheinlich ist, dass die Dump- Funktion (Variable) sofort funktioniert

Eigenständige

Dies wurde über den von icode4food bereitgestellten Link gefunden

$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

Alle benutzerdefinierten Variablen sichern:

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

Sie können mein Plugin verwenden, das das für Sie erledigt (und die Ausgabe gut formatiert):

Twig Dump Bar


schöner Ausschnitt. Danke. Das funktioniert bei mir, wenn ich dump (value) durch value | ersetze var_dump
matthijs koevoets

3

{{ dump() }} funktioniert bei mir nicht PHPDrosseln. Nistniveau zu tief, denke ich.

Alles, was Sie wirklich für debugTwig-Vorlagen benötigen, wenn Sie eine verwenden, debuggerist eine Erweiterung wie diese .

Dann müssen Sie nur noch einen Haltepunkt festlegen und anrufen, {{ inspect() }}wo immer Sie ihn benötigen. Sie erhalten die gleichen Informationen wie mit, {{ dump() }}jedoch in Ihrem Debugger.


3

Da Symfony> = 2.6 ist, gibt es eine nette VarDumper- Komponente, die jedoch von Twigs dump()Funktion nicht verwendet wird .

Um es zu überschreiben, können wir eine Erweiterung erstellen:

Vergessen Sie in der folgenden Implementierung nicht, Namespaces zu ersetzen.

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

}

Ja, ich habe danach gesucht :)
Tim Strijdhorst

2

Das vollständige Rezept hier zum schnelleren Nachschlagen (beachten Sie, dass alle Schritte obligatorisch sind):

1) Übergeben Sie beim Instanziieren von Twig die Debug-Option

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

2) Fügen Sie die Debug-Erweiterung hinzu

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

3) Verwenden Sie es wie @Hazarapet Tunanyan darauf hingewiesen

{{ dump(MyVar) }}

oder

{{ dump() }}

oder

{{ dump(MyObject.MyPropertyName) }}

1

Zum Debuggen von Twig-Vorlagen können Sie die Debug-Anweisung verwenden .

Geben Sie hier die Bildbeschreibung ein

Dort können Sie die Debug-Einstellung explizit festlegen.


Ich erhalte 'Unbekannter Tag-Name "debug" mit und ohne Einstellung dieses twig.debug: true
Alexander Morland

Wenn Sie im Prod-Modus arbeiten, müssen Sie zuerst den Cache leeren
Raffael

@AlexanderMorland Hallo Alex, du musst deine Konfiguration wie hier beschrieben erweitern: github.com/symfony/symfony-docs/issues/455#issuecomment-1884861 , um den Unknown tag name "debug"Fehler zu beseitigen .
Grippe

1

Sie können bearbeiten

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

und ändern Sie die the var_dump()Funktionen in\Doctrine\Common\Util\Debug::dump()


3
Das Bearbeiten von Inhalten im Herstellerordner wird dringend empfohlen.
Luis Milanese

1

Da die meisten guten PHP-Programmierer XDebug gerne verwenden, um den laufenden Code zu durchlaufen und zu beobachten, wie sich Variablen in Echtzeit ändern, dump()fühlt sich die Verwendung wie ein Schritt zurück in die schlechten alten Zeiten an.

Deshalb habe ich eine Twig Debug-Erweiterung erstellt und auf Github gestellt.

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

composer require delboy1978uk/twig-debug

Fügen Sie dann die Erweiterung hinzu. Wenn Sie Symfony nicht verwenden, gehen Sie wie folgt vor:

<?php

use Del\Twig\DebugExtension;

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

Wenn ja, so in Ihrer Dienste YAML-Konfiguration:

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

Einmal registriert, können Sie dies jetzt überall in einer Zweigvorlage tun:

{{ breakpoint() }}

Jetzt können Sie XDebug verwenden, die Ausführung wird angehalten und Sie können alle Eigenschaften sowohl des Kontexts als auch der Umgebung sehen.

Habe Spaß! :-D


0

Sie können die Dump- Funktion verwenden und so drucken

{{ dump(MyVar) }}

Aber es gibt auch eine nette Sache: Wenn Sie kein Argument für die Dump-Funktion festlegen, werden alle verfügbaren Variablen gedruckt , z

{{ dump() }}

Ja, es funktioniert, aber Sie müssen sicherstellen, dass das Debuggen in den Optionen aktiviert ist, wenn Sie Twig
Tudor Ilisoi

0

Wenn Sie sich in einer Umgebung befinden, in der Sie die dumpFunktion nicht verwenden können (z. B. opencart), können Sie Folgendes versuchen:

{{ my_variable | json_encode(constant('JSON_PRETTY_PRINT')) }}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.