【问题标题】:Symfony 4.4 dump is not outputing anything when response is returned返回响应时,Symfony 4.4 转储不输出任何内容
【发布时间】:2022-01-14 23:20:35
【问题描述】:

我想使用 symfony 函数 dump() 并且必须在我返回响应后立即确定没有输出。我制作了一个非常简单的控制器来证明这一点:

<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;

class EasyController extends AbstractController
{
    public function number()
    {
        $number = random_int(0, 100);
        dump($this);
        return new Response(
            '<html><body>Lucky number: '.$number.'</body></html>'
            );
    }
}

如果我在转储() 之后包含“退出”,转储会显示在浏览器中,如果我返回响应,我只会在 Symfony Profiler 中看到转储(但并非总是如此)。但它适用于这个简单的示例。

这是为什么?

我可以从控制器内部输出“var_dump()”,从树枝模板输出dump(),但是当我返回响应时,控制器的dump() 输出会消失。

我真的很想在浏览器中看到我的转储和输出。

【问题讨论】:

  • 自 symfony 4.1 以来就有 dd(),它只是 dump() and die() 在一个方便的功能中。
  • > 为什么会这样?因为 Fabien、Nicolas 和其他 symfony 核心开发人员都是非常聪明的人 :)

标签: symfony dump


【解决方案1】:

Symfony 有一个方便的功能:

dd($data); // is an equivalent of dump($data); die();

但是当我返回响应时,控制器的 dump() 输出消失了。

它不会消失。 Symfony 将其放入分析器(又名调试栏) Symfony 尝试将调试栏“注入”到每个包含 Content-Type: text/html 和至少 &lt;body&gt; 的响应中。

如果你这样做:

$data = ['hello' => 'world'];
dump($data);
// since 'body' is there, symfony will try to inject 
return new Response('<body></body>');

你会在调试栏中看到它

但是如果你发送一个“空”的响应 → 你什么也看不到

$data = ['question' => 'Where\'s the profiler, Lebowski?'];
dump($data);
// there will be no debug-bar 
return new Response('');

但仅仅因为你没有看到它并不意味着没有。您可以随时访问/_profiler URL 来查找最后的请求及其分析器数据。


这是为什么?

输出“漂亮”的调试数据,意味着“注入”一些 HTML (+ JS)。 这会可能会破坏您的布局,这就是 symfony “将其移开”的方式

是的,如果您执行dd($data); 然后查看源代码,您会注意到一些&lt;script&gt;&lt;span class=sf-dump-note&gt;

因此,有几种方法可以从 twig 输出调试转储。 破坏性和非破坏性:

破坏性,带有twigs内置函数dump()

<body>
{{ dump('your data', ['hello', 'world']) }}
</body>

它将在您调用它的地方生成和输出。是的,它会注入它的 HTML (+JS)

非破坏性,带有{% dump %} 标签(需要安装symfony/twig-bridge

注意:这是一个 twig-tag,不是函数,所以不需要 ()

<body>
{% dump some_variable, 'data as string', ['hello', 'world'] %}
</body>

它的行为与控制器中的dump($data); 相同。它移动输出到调试栏,因此您的布局保持不变。

【讨论】:

  • 感谢您的详细回答。我可以自己捕获或注入转储的输出吗?我想为那些没有探查器(例如在测试环境中)的人在树枝模板中实现调试输出,例如 {% if env = dev%} {{dump (var)}}。但这会导致生产错误,因为调试包没有在那里加载。现在寻找另一种方法来做到这一点,而不是重新实现转储()
  • 您可以为devtest 环境启用调试包。然后将您的条件更改为{% if env is not same as('prod') %} {{dump (var)}} {% endif %}
  • 这正是我所做的,但这会在生产中引发错误:dump() 在 any 情况下由 twig-parser 解析,不仅在条件符合。上面的代码 sn -p 导致 prod 上出现“未知函数”异常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多