如何在细枝模板中使用 var _ dump 变量?

查看图层模式,您只显示您已经给了什么是罚款和所有,但您如何知道什么是可用的?TWIG 中是否有“列出所有已定义变量”的功能?有办法转储变量吗?

我通过搜索找到的解决方案是定义一个函数,在这个函数中我可以使用 注入一个函数中的 现有的 PHP 调试工具,但是我找到的所有引用都包括这两行代码,但是没有指定放置它们的位置。根据需要定义 $加载器变量的事实,我尝试了/app/config/autoload.php,但是 $loader 的类型不对。我应该把添加 twig 函数的 php 代码放在哪里?

219377 次浏览

您可以使用 debug标记,它是记录在案的 给你

{% debug expression.varname %}

编辑: 从 Twig 1.5开始,已经不再推荐使用这个函数,并用新的 dump函数替换它(注意,它现在是一个函数,不再是一个标记)。另见: 上述可接受的答案。

对于调试 Twig 模板,可以使用 调试语句

enter image description here

在那里您可以显式地设置调试设置。

所以我把它修好了,部分有点黑客的味道:

  1. app/config/config.yml中设置 twig: debug: 1
  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. To use my own debug function instead of print_r(), I opened vendor/twig-extensions/lib/Twig/Extensions/Node/Debug.php and changed print_r( to d(

PS. I would still like to know how/where to grab the $twig environment to add filters and extensions.

对于 Twig 1.5,正确的答案是使用 dump 函数

\{\{ dump(user) }}

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

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


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

然后在你的模板中:

\{\{ my_variable | var_dump }}

\{\{ dump() }}对我不起作用。 PHP卡住了。我猜是嵌套层太深了。

如果您使用的是 debugger,那么您真正需要的 debug Twig 模板是一个类似于 这个的扩展。

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

你可以编辑

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

并将 the var_dump()函数改为 \Doctrine\Common\Util\Debug::dump()

如果您使用 Twig 作为独立组件,这里有一些如何启用调试的示例,因为 转储(变量)函数不太可能直接开箱即用

单独行动

这是在 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'
));

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


}

转储所有自定义变量:

<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(MyVar) }}

但是也有一个很好的事情,如果你不设置任何参数转储函数,它将打印 所有变量都可用,如

\{\{ dump() }}

这里的完整配方可以更快的参考(注意所有的步骤都是强制性的) :

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

由于大多数优秀的 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

如果您所处的环境无法使用 dump函数(例如: opencart) ,您可以尝试:

\{\{ my_variable | json_encode(constant('JSON_PRETTY_PRINT')) }}