Как переменные var_dump в шаблонах веток?


157

Посмотреть шаблон слоя, где вы только представляете то, что вам дали, это хорошо, и все, но как вы узнаете, что доступно? Есть ли в TWIG функциональность "список всех определенных переменных"? Есть ли способ сбросить переменную?

Решение, которое я нашел путем поиска, состояло в том, чтобы определить функцию, где я мог бы использовать свои существующие инструменты отладки php , внедряя функцию , но все ссылки, которые я нашел на это, включают эти две хорошие строки кода, но нигде не указано, куда разместите их. Исходя из того, что им нужна определенная переменная $ loader , я попытался /app/config/autoload.php, но там был неправильный тип $ loader. Где я могу разместить php-код для добавления функции ветки?

Ответы:


252

Начиная с Twig 1.5, правильный ответ - использовать функцию дампа. Это полностью задокументировано в документации Twig . Вот документация, чтобы включить это внутри Symfony2.

{{ dump(user) }}

3
Кстати, будьте осторожны при сбросе объектов с помощью реляционного отображения
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/issues/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
Кстати: для очистки кеша вы можете использовать консольный инструмент ( stackoverflow.com/questions/6789950/… )
Раффаэль

Есть ли преимущество для этого?
Александр Морланд

это более просто ... если вы не знаете консольный инструмент, я рекомендую вам проверить его
Раффаэль

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

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 в качестве отдельного компонента, вот несколько примеров того, как включить отладку, поскольку маловероятно, что функция dump (variable) будет работать сразу после установки.

Standalone

Это было найдено по ссылке, предоставленной 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 %}

Вы можете использовать мой плагин, который сделает это за вас (и приятно отформатирует вывод):

Twig Dump Bar


хороший фрагмент Спасибо. это работает для меня, если я заменяю dump (значение) значением | var_dump
matthijs koevoets

3

{{ dump() }}не работает для меня PHPдроссели. Уровень вложения слишком глубокий, я думаю.

Все, что вам действительно нужно для debugшаблонов Twig, если вы используете, debugger- это расширение, подобное этому .

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


3

Поскольку Symfony> = 2.6, есть хороший компонент VarDumper , но он не используется dump()функцией Twig .

Чтобы перезаписать его, мы можем создать расширение:

В следующей реализации не забудьте заменить пространства имен.

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 вы можете использовать оператор отладки .

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

Там вы можете установить настройки отладки явно.


Я получаю «Неизвестное имя тега« debug »» с и без установки этого twig.debug: true
Александр Морланд

если вы работаете в режиме prod, вам сначала нужно очистить кеш
Raffael

@AlexanderMorland Привет, Алекс, ты должен расширить свою конфигурацию, как описано здесь: github.com/symfony/symfony-docs/issues/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 config:

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

После регистрации вы можете сделать это в любом месте шаблона веточки:

{{ breakpoint() }}

Теперь вы можете использовать XDebug, выполнение будет приостановлено, и вы сможете увидеть все свойства как контекста, так и среды.

Радоваться, веселиться! :-D


0

Вы можете использовать функцию дампа и распечатать это так

{{ dump(MyVar) }}

но есть и одна приятная вещь: если вы не установите аргумент для функции dump, он выведет все доступные переменные , например

{{ dump() }}

Да, это работает, но вы должны убедиться, что отладка включена в опциях при
создании

0

Если вы находитесь в среде, где вы не можете использовать эту dumpфункцию (например, opencart), вы можете попробовать:

{{ my_variable | json_encode(constant('JSON_PRETTY_PRINT')) }}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.