如何在树枝模板中使用var_dump变量?


156

仅显示已获得的内容的视图层模式就可以了,而且一切都很好,但是您如何知道可用的呢?TWIG中是否有“列出所有定义的变量”功能?有没有一种方法可以转储变量?

我通过搜索找到的解决方案是定义一个函数,通过注入一个函数可以使用现有的php调试工具,但是我发现的所有引用都包括这两行漂亮的代码,但是没有在哪里指定放置它们。基于他们需要定义$ loader变量的事实,我尝试了/app/config/autoload.php,但是那里的$ loader类型错误。我在哪里放置用于添加树枝功能的php代码?

Answers:


251

从Twig 1.5开始,正确的答案是使用转储功能。它在Twig文档中有完整记录这是在Symfony2中启用此功能的文档。

{{ dump(user) }}

3
顺便说一句,在使用关系映射转储对象时要小心
pleerock

14
当我使用{{ dump() }}转储所有变量时,它将返回空白页。还有其他转储变量的方法吗?
杰里·范

我正在使用最新版本的Symfony 2.5,并在为开发环境加载内核时打开了config.yml和config_dev.yml设置以及调试模式。我尝试了下面Morland提到的其他手动方法。无论哪种方式,当使用转储时,我也会得到空白页。而且没有转储。
Chadwick Meyer

如果您有一个空白页,其中包含和不包含dump,显然dump不是问题所在。如果您无法解决,我建议您发布一个新问题。
Icode4food

1
我收到以下错误:`Twig_Error_Syntax-未知的“转储”函数`
Pathros

28

您可以使用debug标签,该标签在此处记录

{% debug expression.varname %}

编辑:从Twig 1.5开始,此功能已被弃用,并替换为新dump功能(请注意,它现在是一个功能,而不再是标记)。另请参阅:上面接受的答案。


7
如果您说错了,请按此处所述Unknown tag name "debug"扩展您的配置(在全局config.ymlconfig_dev.yml):github.com/symfony/symfony-docs/issues/455#issuecomment-1884861
flu

5
从Twig 1.5开始不推荐使用此方法。
Icode4food

4
在答案中添加了弃用说明。
igorw

17

所以我让它工作了,部分有点骇人听闻:

  1. 设置twig: debug: 1app/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

3
您不必进行设置,twig: debug: 1因为它是从您的前控制器环境继承此信息。否则,您可能最终会在产品环境中无意间输出调试信息。只要您在开发环境中工作,默认情况下就会启用它,而在产品环境中则禁用它。
2012年

1
从Twig 1.5开始,这已经过时了。查看其他答案:stackoverflow.com/a/10080404/107768
Icode4food 2012年

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)函数不太可能直接使用

单机版

这是在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 %}

您可以使用我的插件为您做到这一点(可以很好地格式化输出):

树枝转储酒吧


不错的摘要。谢谢。如果我将dump(value)替换为value,这对我有用| var_dump
matthijs koevoets's

3

{{ dump() }}对我不起作用。PHP窒息。我猜嵌套层太深了。

你真正需要debug的树枝,如果您使用的是模板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';
    }

}

是的,我一直在寻找这个:)
Tim Strijdhorst 2016年

2

这里有完整的配方供您快速参考(请注意,所有步骤都是必需的):

1)实例化Twig时,通过debug选项

$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

您可以编辑

/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,执行将暂停,并且您可以看到Context和Environment的所有属性。

玩得开心!:-D


0

您可以使用转储功能并像这样打印

{{ dump(MyVar) }}

但也有一件好事,如果您没有为转储函数设置任何参数,它将打印所有可用变量,例如

{{ dump() }}

是的,它可以工作,但是在实例化Twig时必须确保在选项中启用了调试
Tudor Ilisoi

0

如果您在无法使用该dump功能的环境中(例如:opencart),则可以尝试:

{{ my_variable | json_encode(constant('JSON_PRETTY_PRINT')) }}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.