返回响应时,Symfony 4.4 转储不输出任何内容

Posted

技术标签:

【中文标题】返回响应时,Symfony 4.4 转储不输出任何内容【英文标题】:Symfony 4.4 dump is not outputing anything when response is returned 【发布时间】:2021-12-02 03:52:03 【问题描述】:

我想使用 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 核心开发人员都是非常聪明的人 :) 【参考方案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 上出现“未知函数”异常。

以上是关于返回响应时,Symfony 4.4 转储不输出任何内容的主要内容,如果未能解决你的问题,请参考以下文章

当 Api 返回响应时,如何以角度显示“登录失败。请重试”消息?

如何在Web API中返回响应时隐藏模型的各个部分?

将 Plaid 与 Salesforce 集成

AkkaAkka 传递消息

在 Symfony 4.4 中使用注解测试控制器

iOS网络数据指标收集