【问题标题】:How to var_dump variables in twig templates?如何在树枝模板中 var_dump 变量?
【发布时间】:2011-11-11 03:49:02
【问题描述】:

视图层模式,你只呈现你已经得到的东西很好,但你怎么知道什么是可用的? TWIG 中是否有“列出所有定义的变量”功能? 有没有办法转储变量?

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

【问题讨论】:

    标签: debugging twig


    【解决方案1】:

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

    {{ dump(user) }}
    

    【讨论】:

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

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

    {% debug expression.varname %}
    

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

    【讨论】:

    【解决方案3】:

    如果你在无法使用dump功能的环境(例如:opencart),可以试试:

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

    【讨论】:

      【解决方案4】:

      所以我得到了它的工作,部分有点hackish:

      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. 为了使用我自己的调试功能而不是print_r(),我打开vendor/twig-extensions/lib/Twig/Extensions/Node/Debug.php并将print_r(更改为d(

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

      【讨论】:

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

      如果您在应用程序中使用 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(...
      【解决方案6】:

      转储所有自定义变量:

      <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

      【讨论】:

      • 不错的sn-p。谢谢。如果我将 dump(value) 替换为 value | 这对我有用var_dump
      【解决方案7】:

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

      【讨论】:

        【解决方案8】:

        {{ dump() }} 不适合我。 PHP 扼流圈。我猜嵌套级别太深了。

        如果您使用debugger,您真正需要的debug Twig 模板就是this 之类的扩展。

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

        【讨论】:

          【解决方案9】:

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

          【讨论】:

          • 是的,我在找这个 :)
          【解决方案10】:

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

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

          【讨论】:

            【解决方案11】:

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

            您可以在此处明确设置调试设置。

            【讨论】:

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

            你可以编辑

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

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

            【讨论】:

            • 强烈建议不要编辑 vendor 文件夹下的任何内容。
            【解决方案13】:

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

            【讨论】:

              【解决方案14】:

              你可以使用dump功能,像这样打印出来

              {{ dump(MyVar) }}
              

              不过还有一件好事,如果你不给转储函数设置任何参数,它会打印出all variables are available,比如

              {{ dump() }}
              

              【讨论】:

              • 是的,它可以工作,但您需要确保在实例化 Twig 时在选项中启用调试
              猜你喜欢
              • 1970-01-01
              • 2013-08-07
              • 2013-05-11
              • 2012-07-27
              • 2016-02-14
              • 1970-01-01
              • 2016-05-11
              • 2015-03-21
              相关资源
              最近更新 更多