返回响应时,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
和至少 <body>
的响应中。
如果你这样做:
$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);
然后查看源代码,您会注意到一些<script>
和<span class=sf-dump-note>
因此,有几种方法可以从 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)。但这会导致生产错误,因为调试包没有在那里加载。现在寻找另一种方法来做到这一点,而不是重新实现转储() 您可以为dev
和test
环境启用调试包。然后将您的条件更改为% if env is not same as('prod') % dump (var) % endif %
这正是我所做的,但这会在生产中引发错误:dump() 在 any 情况下由 twig-parser 解析,不仅在条件符合。上面的代码 sn -p 导致 prod 上出现“未知函数”异常。以上是关于返回响应时,Symfony 4.4 转储不输出任何内容的主要内容,如果未能解决你的问题,请参考以下文章