Jak zrzucić zmienne var_dump w szablonach twig?

156

Wyświetl wzór warstw, w którym prezentujesz tylko to, co otrzymałeś, jest w porządku i wszystko, ale skąd wiesz, co jest dostępne? Czy w TWIG jest funkcjonalność „wyświetl wszystkie zdefiniowane zmienne”? Czy istnieje sposób na zrzucenie zmiennej?

Rozwiązaniem, które znalazłem, szukając go, było zdefiniowanie funkcji, w której mogę użyć moich istniejących narzędzi do debugowania php , wstrzykując funkcję , ale wszystkie znalezione odniesienia obejmują te ładne dwa wiersze kodu, ale nigdzie nie określono, gdzie Umieść je. Biorąc pod uwagę fakt, że potrzebują zdefiniowanej zmiennej $ loader , próbowałem /app/config/autoload.php, ale $ loader był niewłaściwego rodzaju. Gdzie mam umieścić kod PHP w celu dodania funkcji twig?

Alexander Morland
źródło

Odpowiedzi:

251

Od Twig 1.5 poprawną odpowiedzią jest użycie funkcji zrzutu. Jest to w pełni udokumentowane w dokumentacji Twig . Oto dokumentacja umożliwiająca to w Symfony2.

{{ dump(user) }}
Icode4food
źródło
3
Przy okazji,
zachowaj
14
Kiedy używam {{ dump() }}do zrzucania wszystkich zmiennych, zwraca pustą stronę. Czy jest inny sposób na zrzucenie zmiennej?
Jerry Pham
Używam najnowszej wersji Symfony 2.5 i mam włączone konfiguracje config.yml i config_dev.yml oraz tryb debugowania podczas ładowania jądra dla środowiska deweloperskiego. Wypróbowałem inne metody manualne wymienione poniżej przez Morlanda. Tak czy inaczej, otrzymuję również pustą stronę, gdy używany jest zrzut. I żadnego zrzutu.
Chadwick Meyer
Jeśli otrzymasz pustą stronę z i bez dump, oczywiście dumpnie stanowi to problemu. Sugerowałbym opublikowanie nowego pytania, jeśli nie możesz rozwiązać tego w inny sposób.
Icode4food
1
Pojawia się następujący błąd: `Twig_Error_Syntax - nieznane„dump”zakresie funkcji
Patros
28

Możesz użyć debugtagu, który jest udokumentowany tutaj .

{% debug expression.varname %}

Edycja: Od Twig 1.5 ta dumpfunkcja została wycofana i zastąpiona nową funkcją (uwaga, jest to teraz funkcja, a nie tag). Zobacz także: zaakceptowana odpowiedź powyżej.

igorw
źródło
7
Jeśli pojawi się błąd z informacją Unknown tag name "debug", rozszerz konfigurację (globalną config.ymllub config_dev.yml) zgodnie z opisem tutaj: github.com/symfony/symfony-docs/issues/455#issuecomment-1884861
flu
5
Ta metoda jest przestarzała od Twig 1.5.
Icode4food
4
Dodano informację o wycofaniu do odpowiedzi.
igorw
17

Więc działało, częściowo trochę hakerskie:

  1. Ustaw twig: debug: 1wapp/config/config.yml
  2. Dodaj to do config_dev.yml

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

  4. Aby zamiast tego użyć własnej funkcji debugowania print_r(), otworzyłem vendor/twig-extensions/lib/Twig/Extensions/Node/Debug.phpi zmieniłem print_r(nad(

PS. Nadal chciałbym wiedzieć, jak / gdzie pobrać środowisko $ twig, aby dodać filtry i rozszerzenia.

Alexander Morland
źródło
1
btw: do wyczyszczenia pamięci podręcznej możesz użyć narzędzia konsoli ( stackoverflow.com/questions/6789950/… )
Raffael
czy jest jakaś korzyść, aby to zrobić?
Alexander Morland,
jest to prostsze ... jeśli nie znasz narzędzia konsoli, polecam to sprawdzić
Raffael
3
Nie powinieneś tego ustawiać, twig: debug: 1ponieważ dziedziczy on te informacje ze środowiska kontrolera frontowego. W przeciwnym razie możesz skończyć nieumyślnym wyświetlaniem informacji debugowania w środowisku produkcyjnym. Dopóki pracujesz w środowisku deweloperskim, jest ono domyślnie włączone i wyłączone w środowisku produkcyjnym.
grypa
1
Jest to nieaktualne od Twig 1.5. Zobacz inną odpowiedź: stackoverflow.com/a/10080404/107768
Icode4food
14

Jeśli używasz Twig w swojej aplikacji jako komponentu, możesz to zrobić:

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

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

Następnie w swoich szablonach:

{{ my_variable | var_dump }}
Julio
źródło
Gdzie je umieścić / wymienić $twig = new Twig_Environment($loader, array(...?
PolGraphic
5

Jeśli używasz Twig jako samodzielnego komponentu, oto przykład włączania debugowania, ponieważ jest mało prawdopodobne, aby funkcja dump (zmienna) działała od razu po wyjęciu z pudełka

Samodzielny

Zostało to znalezione w linku podanym przez 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
źródło
5

Zrzuć wszystkie zmienne niestandardowe:

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

Możesz użyć mojej wtyczki, która zrobi to za Ciebie (ładnie sformatuje wynik):

Twig Dump Bar

kapitalny
źródło
ładny fragment. Dziękuję Ci. to działa dla mnie, jeśli zastąpię dump (wartość) wartością | var_dump
matthijs koevoets
3

{{ dump() }}nie działa dla mnie. PHPdławiki. Wydaje mi się, że poziom zagnieżdżenia jest zbyt głęboki.

Wszystko, czego naprawdę potrzebujesz do debugszablonów Twig, jeśli używasz debuggerrozszerzenia, to takie rozszerzenie .

Wtedy wystarczy ustawić punkt przerwania i dzwonić {{ inspect() }}tam, gdzie jest to potrzebne. Otrzymasz te same informacje, co w przypadku, {{ dump() }}ale w debugerze.

Christian Fecteau
źródło
3

Od Symfony> = 2.6, istnieje ładny komponent VarDumper , ale nie jest używany przez dump()funkcję Twiga .

Aby go nadpisać, możemy utworzyć rozszerzenie:

W poniższej implementacji nie zapomnij zastąpić przestrzeni nazw.

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
źródło
Tak, szukałem tego :)
Tim Strijdhorst
2

Pełny przepis na szybszy dostęp (pamiętaj, że wszystkie kroki są obowiązkowe):

1) podczas tworzenia instancji Twig przekaż opcję debugowania

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

2) dodaj rozszerzenie debugowania

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

3) Używaj go tak, jak wskazał @Hazarapet Tunanyan

{{ dump(MyVar) }}

lub

{{ dump() }}

lub

{{ dump(MyObject.MyPropertyName) }}
Tudor Ilisoi
źródło
1

Do debugowania szablonów Twig można użyć instrukcji debug .

wprowadź opis obrazu tutaj

Tam możesz jawnie ustawić ustawienie debugowania.

Raffael
źródło
Otrzymuję komunikat „Nieznana nazwa tagu„ debug ”” z ustawieniem twig.debug i bez niego: true
Alexander Morland,
jeśli pracujesz w trybie prod, musisz najpierw wyczyścić pamięć podręczną
Raffael
@AlexanderMorland Cześć Alex, musisz rozszerzyć swoją konfigurację zgodnie z opisem tutaj: github.com/symfony/symfony-docs/issues/455#issuecomment-1884861, aby pozbyć się Unknown tag name "debug"błędu.
grypa
1

Możesz edytować

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

i zmień the var_dump()funkcje na\Doctrine\Common\Util\Debug::dump()

user3420644
źródło
3
Nie zaleca się edytowania czegokolwiek w folderze dostawcy.
Luis Milanese
1

Ponieważ większość dobrych programistów PHP lubi używać XDebug do faktycznego przechodzenia przez uruchamiany kod i obserwowania zmian zmiennych w czasie rzeczywistym, używanie go dump()wydaje się być krokiem wstecz do starych, złych czasów.

Dlatego stworzyłem rozszerzenie Twig Debug i umieściłem je na Github.

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

composer require delboy1978uk/twig-debug

Następnie dodaj rozszerzenie. Jeśli nie używasz Symfony, na przykład:

<?php

use Del\Twig\DebugExtension;

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

Jeśli tak, jak to w konfiguracji YAML usług:

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

Po rejestracji możesz teraz zrobić to w dowolnym miejscu w szablonie gałązki:

{{ breakpoint() }}

Teraz możesz użyć XDebug, wykonanie zostanie wstrzymane i zobaczysz wszystkie właściwości zarówno kontekstu, jak i środowiska.

Baw się dobrze! :-RE

delboy1978uk
źródło
0

możesz użyć funkcji zrzutu i wydrukować to w ten sposób

{{ dump(MyVar) }}

ale jest też jedna fajna rzecz, jeśli nie ustawisz żadnego argumentu do funkcji dump, wypisze wszystkie dostępne zmienne , takie jak

{{ dump() }}
Hazarapet Tunanyan
źródło
Tak, to działa, ale musisz upewnić się, że debugowanie jest włączone w opcjach podczas tworzenia instancji Twig
Tudor Ilisoi
0

Jeśli jesteś w środowisku, w którym nie możesz użyć tej dumpfunkcji (np. Opencart), możesz spróbować:

{{ my_variable | json_encode(constant('JSON_PRETTY_PRINT')) }}
redochka
źródło