Debugging 如何在细枝模板中转储变量?

Debugging 如何在细枝模板中转储变量?,debugging,twig,Debugging,Twig,视图层模式,您只显示您所得到的是好的和所有的,但您如何知道什么是可用的?TWIG中是否有“列出所有定义的变量”功能?是否有方法转储变量 我通过搜索找到的解决方案是定义一个可以使用by的函数,但是我找到的所有引用都包含这两行代码,但是没有指定放在哪里。考虑到他们需要定义一个$loader变量,我尝试了/app/config/autoload.php,但那里的$loader类型不正确。用于添加细枝函数的php代码放在哪里?您可以使用debug标记,该标记已记录在案 编辑:从Twig 1.5开始,它已

视图层模式,您只显示您所得到的是好的和所有的,但您如何知道什么是可用的?TWIG中是否有“列出所有定义的变量”功能?是否有方法转储变量


我通过搜索找到的解决方案是定义一个可以使用by的函数,但是我找到的所有引用都包含这两行代码,但是没有指定放在哪里。考虑到他们需要定义一个$loader变量,我尝试了/app/config/autoload.php,但那里的$loader类型不正确。用于添加细枝函数的php代码放在哪里?

您可以使用
debug
标记,该标记已记录在案


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

有关调试细枝模板的信息,您可以使用


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

所以我让它工作了,部分是有点黑客的:

  • app/config/config.yml
  • 将此添加到config_dev.yml

    services:
        debug.twig.extension:
            class: Twig_Extensions_Extension_Debug
            tags: [{ name: 'twig.extension' }]
    
  • sudorm-fr应用程序/cache/dev

  • 为了使用我自己的调试功能而不是
    print\r()
    ,我打开了
    vendor/twig extensions/lib/twig/extensions/Node/debug.php
    ,并将
    print\r(
    更改为
    d(

  • 另外,我仍然想知道如何/从何处获取$twig环境以添加过滤器和扩展。

    从twig 1.5开始,正确的答案是使用dump功能


    如果您在应用程序中将细枝用作组件,则可以执行以下操作:

    $twig = new Twig_Environment($loader, array(
        'autoescape' => false
    ));
    
    $twig->addFilter('var_dump', new Twig_Filter_Function('var_dump'));
    
    然后在模板中:

    {{ my_variable | var_dump }}
    
    {{dump()}
    不适合我。
    PHP
    阻塞。我想嵌套级别太深了

    如果您使用的是
    调试器
    ,那么真正需要调试的
    小树枝模板就是这样的扩展

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

    您可以进行编辑

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

    如果将细枝用作独立组件,请将var\u dump()
    函数更改为
    \doctor\Common\Util\Debug::dump()

    ,下面是一些如何启用调试的示例,因为dump(variable)函数不太可能直接工作

    独立的 这是在icode4food提供的链接上找到的

    $twig = new Twig_Environment($loader, array(
        'debug' => true,
        // ...
    ));
    $twig->addExtension(new Twig_Extension_Debug());
    
    锡莱克斯
    因为Symfony>=2.6,所以有一个不错的组件,但是Twig的
    dump()
    函数没有使用它

    要覆盖它,我们可以创建一个扩展:

    在下面的实现中,不要忘记替换名称空间

    Fuz/AppBundle/Resources/config/services.yml

    Fuz/AppBundle/Twig/Extension/DebugExtension.php


    转储所有自定义变量:

    <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 %}
    
    传递到视图的变量:
    {%为键,值在_context%}
    {%如果键以“{%”开头
    {%else%}
    {{key}}
    {{dump(value)}}
    {%endif%}
    {%endfor%}
    
    您可以使用我的插件,它将为您实现这一点(将很好地格式化输出):


    您可以使用dump功能并按如下方式打印

    {{ dump(MyVar) }}
    
    但还有一件好事,如果您不将任何参数设置为dump函数,它将打印所有变量都可用,如

    {{ dump() }}
    

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

    1) 实例化细枝时,传递调试选项

    $twig = new Twig_Environment(
    $loader, ['debug'=>true, 'cache'=>false, /*other options */]
    );
    
    2) 添加调试扩展

    $twig->addExtension(new \Twig_Extension_Debug());
    
    3) 像@Hazarapet Tunnyan指出的那样使用它

    {{ dump(MyVar) }}
    


    由于大多数优秀的PHP程序员都喜欢使用XDebug逐步运行代码并实时观察变量的变化,因此使用
    dump()
    感觉就像回到了糟糕的过去

    这就是为什么我制作了一个Twig调试扩展并将其放在Github上

    编写器需要delboy1978uk/twig调试

    然后添加扩展名。如果您不使用Symfony,如下所示:

    <?php
    
    use Del\Twig\DebugExtension;
    
    /** @var $twig Twig_Environment */
    $twig->addExtension(new DebugExtension());
    
    注册后,您现在可以在细枝模板中的任何位置执行此操作:

    {{ breakpoint() }}
    
    现在,您可以使用XDebug,执行将暂停,您可以看到上下文和环境的所有属性


    玩得开心-D

    如果您所在的环境无法使用
    转储
    功能(例如:opencart),您可以尝试:

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

    我得到了“未知标记名”debug“,无论是否设置该细枝。debug:true如果您在prod模式下工作,则必须清除缓存first@AlexanderMorland您好,Alex,您必须按此处所述扩展配置:要摆脱
    未知标记名“debug”
    error。顺便说一句:要清除缓存,您可以使用console工具()这样做有什么好处吗?它更简单…如果你不知道控制台工具,我建议你检查一下。你不必设置
    twig:debug:1
    ,因为它从你的前端控制器的环境中继承了这些信息。否则你可能会在pr中非常规地输出调试信息od环境。只要您在开发环境中工作,它在默认情况下是启用的,在prod环境中是禁用的。这在Twig 1.5中已经过时。请参阅其他答案:如果您收到一个错误,说
    未知标记名“debug”
    ,请扩展您的配置(在全局
    config.yml
    config_dev.yml
    中)如下所述:此方法在Twig 1.5中被弃用。在answer中添加了弃用说明。顺便说一句,在使用
    {dump()}时,使用关系映射转储对象时要小心
    要转储所有变量,它将返回一个空白页。是否有其他方法转储变量?我使用的是最新版本的Symfony 2.5,并具有config.yml和
    $twig->addExtension(new \Twig_Extension_Debug());
    
    {{ dump(MyVar) }}
    
    {{ dump() }}
    
    {{ dump(MyObject.MyPropertyName) }}
    
    <?php
    
    use Del\Twig\DebugExtension;
    
    /** @var $twig Twig_Environment */
    $twig->addExtension(new DebugExtension());
    
    twig_debugger:
        class: Del\Twig\DebugExtension
        tags:
            - { name: twig.extension }
    
    {{ breakpoint() }}
    
    {{ my_variable | json_encode(constant('JSON_PRETTY_PRINT')) }}