ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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


I
Icode4food

从 Twig 1.5 开始,正确的答案是使用转储函数。 It is fully documented in the Twig documentationHere is the documentation to enable this inside Symfony.

{{ dump(user) }}

顺便说一句,使用关系映射转储对象时要小心
当我使用 {{ dump() }} 转储所有变量时,它返回一个空白页。有没有其他方法可以转储变量?
我收到以下错误:`Twig_Error_Syntax - 未知的“转储”函数`
此链接中描述了从 twig 中查找完整数据层的更好方法:how-to-retrieve-all-variables-from-a-twig-template 对我有用的响应是 <script>console.log({{ _context | json_encode | raw }});</script>。希望这可以帮助
如果 Twig 中的 dump() 只是一个空白屏幕,请检查您的服务器错误日志,这通常是内存耗尽的问题
i
igorw

您可以使用记录在 here 中的 debug 标记。

{% debug expression.varname %}

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


如果您收到错误提示 Unknown tag name "debug",请按照此处所述扩展您的配置(在全局 config.ymlconfig_dev.yml 中):github.com/symfony/symfony-docs/issues/455#issuecomment-1884861
从 Twig 1.5 开始不推荐使用此方法。
在答案中添加了弃用说明。
r
redochka

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

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

A
Alexander Morland

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

在 app/config/config.yml 中设置 twig: debug: 1 将此添加到 config_dev.yml services: debug.twig.extension: class: Twig_Extensions_Extension_Debug tags: [{ name: 'twig.extension' }] sudo rm -fr app/ cache/dev 为了使用我自己的调试函数而不是 print_r(),我打开了 vendor/twig-extensions/lib/Twig/Extensions/Node/Debug.php 并将 print_r( 更改为 d(

PS。我仍然想知道如何/在哪里获取 $twig 环境以添加过滤器和扩展。


顺便说一句:要清除缓存,您可以使用控制台工具 (stackoverflow.com/questions/6789950/…)
这样做有什么好处吗?
它更简单......如果你不知道控制台工具,我建议你检查一下
您不必设置 twig: debug: 1,因为它从您的前端控制器的环境中继承此信息。否则,您最终可能会在生产环境中无意中输出调试信息。只要您在开发环境中工作,它就会默认启用,而在您的生产环境中则禁用。
从 Twig 1.5 开始,这已经过时了。查看其他答案:stackoverflow.com/a/10080404/107768
J
Julio

如果您在应用程序中使用 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(...
k
kapitalny

转储所有自定义变量:

<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(value) 替换为 value | 这对我有用var_dump
C
Carlton

如果您将 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'
));

T
Tudor Ilisoi

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

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

A
Anoop

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

如果您使用 debugger,您真正需要 debug Twig 模板的只是像 this 这样的扩展。

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


A
Alain Tiemblo

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

}

是的,我正在寻找这个:)
R
Raffael

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

https://i.stack.imgur.com/BqaXa.jpg

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


我得到 'Unknown tag name "debug" ' 设置和不设置该 twig.debug: true
如果您在 prod 模式下工作,则必须先清除缓存
@AlexanderMorland 嗨,Alex,您必须按照此处所述扩展您的配置:github.com/symfony/symfony-docs/issues/455#issuecomment-1884861 以消除 Unknown tag name "debug" 错误。
C
Christian Giupponi

你可以编辑

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

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


强烈建议不要编辑供应商文件夹下的任何内容。
d
delboy1978uk

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


H
Hazarapet Tunanyan

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

{{ dump(MyVar) }}

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

{{ dump() }}

是的,它可以工作,但是您需要确保在实例化 Twig 时在选项中启用调试