Як var_dump змінні у шаблонах гілочок?


156

Переглядайте шаблон шару, де ви представляєте лише те, що вам було надано, це добре і все, але як ви знаєте, що доступно? Чи є функція "список усіх визначених змінних" у TWIG? Чи є спосіб скинути змінну?

Я знайшов рішення, шукаючи його, було визначити функцію, де я можу використовувати свої існуючі інструменти налагодження php , вводячи функцію , але всі знайдені нами посилання включають ці непогані два рядки коду, але ніде не вказано, куди потрібно розмістіть їх. Ідучи через те, що їм потрібна визначена змінна завантажувача $ , я спробував /app/config/autoload.php, але завантажувач $ там був неправильного типу. Де я розміщую php-код для додавання функції гілочки?

Відповіді:


251

Станом на Twig 1.5 правильною відповіддю є використання функції скидання. Це повністю зафіксовано в документації Twig . Ось документація для включення цього всередині Symfony2.

{{ dump(user) }}

3
BTW, будьте обережні, скидаючи об'єкти з реляційним відображенням
pleerock

14
Коли я використовую {{ dump() }}для скидання всіх змінних, він повертає порожню сторінку. Чи є інший спосіб скинути змінну?
Джеррі Фам

Я використовую останню версію Symfony 2.5 і ввімкнув настройку config.yml та config_dev.yml та режим налагодження при завантаженні ядра для середовища розробки. Я спробував інші ручні методи, згадані Морландом нижче. У будь-якому випадку я також отримую порожню сторінку, коли використовується дамп. І ніякого сміття.
Чадвік Мейєр

Якщо ви отримуєте порожню сторінку з і без dump, очевидно, dumpце не проблема. Я б запропонував розмістити нове запитання, якщо ви не можете зрозуміти це інакше.
Icode4food

1
Я отримую таку помилку: `Twig_Error_Syntax - Невідома функція" dump "
Pathros,

28

Ви можете використовувати debugтег, який документованої тут .

{% debug expression.varname %}

Редагувати: Станом на Twig 1.5, цю dumpфункцію застаріло та замінено новою функцією (зауважте, тепер це функція і більше не тег). Дивіться також: Прийнята відповідь вище.


7
Якщо ви отримаєте помилку Unknown tag name "debug", скажіть, розгорніть конфігурацію (або в глобальній, config.ymlабо config_dev.yml), як описано тут: github.com/symfony/symfony-docs/isissue/455#issuecomment-1884861
грип

5
Цей метод застарілий, як у Twig 1.5.
Icode4food

4
До відповіді додано нотатку про анулювання.
igorw

17

Тож у мене це працює, почасти трохи хакітно:

  1. встановити twig: debug: 1вapp/config/config.yml
  2. Додайте це до config_dev.yml

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

  4. Щоб використовувати власну функцію налагодження замість print_r(), я відкрив vendor/twig-extensions/lib/Twig/Extensions/Node/Debug.phpі змінив print_r(наd(

PS. Я все одно хотів би знати, як / де захопити середовище $ twig, щоб додати фільтри та розширення.


1
btw: для очищення кешу можна скористатися консольним інструментом ( stackoverflow.com/questions/6789950/… )
Raffael

чи є якась перевага для цього?
Олександр Морланд

це простіше ... якщо ви не знаєте консольний інструмент, рекомендую перевірити його
Raffael

3
Вам не доведеться встановлювати, twig: debug: 1оскільки вона успадковує цю інформацію з оточення вашого переднього контролера. В іншому випадку ви можете ненавмисно вивести інформацію про налагодження у вашому середовищі prod. Поки ви працюєте в середовищі розробників, це ввімкнено за замовчуванням і він відключений у вашому середовищі prod.
грип

1
Це застаріло станом на Twig 1.5. Див інший відповідь: stackoverflow.com/a/10080404/107768
Icode4food

14

Якщо ви використовуєте Twig у своїй програмі як компонент, ви можете зробити це:

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

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

Потім у своїх шаблонах:

{{ my_variable | var_dump }}

Де їх розмістити / замінити $twig = new Twig_Environment($loader, array(...?
PolGraphic

5

Якщо ви використовуєте Twig як окремий компонент, ось декілька прикладів того, як увімкнути налагодження, оскільки навряд чи функція дампа (змінна) буде працювати прямо з поля

Автономний

Це було знайдено за посиланням, яке надає icode4food

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

Сілекс

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

5

Вивантажте всі власні змінні:

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

Ви можете використовувати мій плагін, який зробить це для вас (а ви добре відформатуєте вихід):

Трюмовий відвал бар


приємний фрагмент спасибі. це працює для мене, якщо я заміню дамп (значення) значенням | var_dump
Matthijs koevoets

3

{{ dump() }}не працює для мене. PHPдроселі. Я думаю, що рівень гніздування занадто глибокий.

Все , що вам дійсно потрібно debugTwig шаблони , якщо ви з допомогою debuggerє розширенням , як це .

Тоді справа лише в тому, щоб встановити точку перерви та зателефонувати, {{ inspect() }}куди вам потрібно. Ви отримуєте ту саму інформацію, що і {{ dump() }}у вашому налагоджувачі.


3

Оскільки Symfony> = 2.6, є хороший компонент VarDumper , але він не використовується функцією Twig dump().

Щоб замінити його, ми можемо створити розширення:

У наступній реалізації не забудьте замінити простори імен.

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

}

Так, я шукав це :)
Тім Стрійдхорст

2

Повний рецепт тут для швидшого ознайомлення (зверніть увагу, що всі кроки є обов’язковими):

1) при інстанціюванні Twig перейдіть до налагодження

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

2) додати розширення для налагодження

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

3) Використовуйте його так, як вказував @Hazarapet Tunanyan

{{ dump(MyVar) }}

або

{{ dump() }}

або

{{ dump(MyObject.MyPropertyName) }}

1

Для налагодження шаблонів Twig ви можете використовувати оператор налагодження .

введіть тут опис зображення

Там ви можете чітко встановити налаштування налагодження.


Я отримую "Невідоме ім'я тегу" налагодження "з і без встановлення цього twig.debug: true
Alexander Morland

якщо ви працюєте в режимі prod, ви повинні спочатку очистити кеш
Raffael

@AlexanderMorland Привіт Алекс, вам потрібно розширити конфігурацію, як описано тут: github.com/symfony/symfony-docs/isissue/455#issuecomment-1884861, щоб позбутися Unknown tag name "debug"помилки.
грип

1

Ви можете редагувати

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

і змінити the var_dump()функції на\Doctrine\Common\Util\Debug::dump()


3
Редагувати що-небудь у папці постачальника настійно не рекомендується.
Луїс Міланес

1

Оскільки більшість хороших програмістів PHP люблять використовувати XDebug, щоб насправді перейти через запущений код і спостерігати за зміною змінних у режимі реального часу, використовуючи dump()відчуття, як крок назад до поганих старих часів.

Тому я зробив розширення Twig Debug і поставив його на Github.

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

composer require delboy1978uk/twig-debug

Потім додайте розширення. Якщо ви не використовуєте Symfony, наприклад:

<?php

use Del\Twig\DebugExtension;

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

Якщо ви є, як це у ваших службах конфігурація YAML:

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

Після реєстрації ви можете це зробити в будь-якому місці в шаблоні гілочок:

{{ breakpoint() }}

Тепер ви можете використовувати XDebug, виконання буде призупинено, і ви зможете побачити всі властивості і контексту, і середовища.

Веселіться! :-D


0

ви можете використовувати функцію скидання та друкувати її так

{{ dump(MyVar) }}

але є і одна приємна річ, якщо ви не встановите жодного аргументу для скидання функції, вона надрукує всі доступні змінні , наприклад

{{ dump() }}

Так, це працює, але вам потрібно переконатися, що налагодження увімкнено в параметрах при екземплярі Twig
Tudor Ilisoi

0

Якщо ви перебуваєте в середовищі, де ви не можете використовувати dumpфункцію (наприклад: opencart), ви можете спробувати:

{{ my_variable | json_encode(constant('JSON_PRETTY_PRINT')) }}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.