166

查看图层模式,您只展示您所获得的内容,这很好,但您如何知道可用的内容?TWIG 中是否有“列出所有定义的变量”功能?有没有办法转储变量?

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

4

14 回答 14

264

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

{{ dump(user) }}
于 2012-04-09T21:58:22.600 回答
29

您可以使用此处debug记录的标签。

{% debug expression.varname %}

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

于 2011-09-06T10:12:16.790 回答
22

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

{{ my_variable | json_encode(constant('JSON_PRETTY_PRINT')) }}
于 2020-03-29T16:59:31.560 回答
17

所以我让它工作了,部分有点hackish:

  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 环境以添加过滤器和扩展。

于 2011-09-06T10:56:28.227 回答
15

如果您在应用程序中使用 Twig 作为组件,您可以这样做:

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

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

然后在您的模板中:

{{ my_variable | var_dump }}
于 2012-05-03T14:11:55.540 回答
7

转储所有自定义变量:

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

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

树枝转储栏

于 2016-03-05T15:46:57.910 回答
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'
));
于 2014-11-06T11:43:02.920 回答
3

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

debug如果您使用的debugger是这样的扩展,那么您真正需要的Twig 模板就是这样的扩展。

然后只需设置断点并{{ inspect() }}在需要的地方调用即可。您将获得与 with 相同的信息,{{ dump() }}但在您的调试器中。

于 2012-08-21T17:14:22.310 回答
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';
    }

}
于 2014-12-20T11:35:47.180 回答
3

此处的完整配方供您快速参考(请注意,所有步骤都是强制性的):

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) }}
于 2016-11-30T14:57:51.933 回答
1

要调试 Twig 模板,您可以使用debug 语句

在此处输入图像描述

您可以在那里明确设置调试设置。

于 2011-09-06T10:18:47.680 回答
1

你可以编辑

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

并将the var_dump()功能更改为\Doctrine\Common\Util\Debug::dump()

于 2014-03-14T16:04:30.877 回答
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 }

注册后,您现在可以在 twig 模板中的任何位置执行此操作:

{{ breakpoint() }}

现在,您可以使用 XDebug,执行将暂停,您可以看到 Context 和 Environment 的所有属性。

玩得开心!:-D

于 2018-07-05T14:30:05.997 回答
0

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

{{ dump(MyVar) }}

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

{{ dump() }}
于 2016-04-28T21:25:47.853 回答