我想利用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 有一个方便的功能:
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输出调试转储。 破坏性和非破坏性:
破坏性,带有树枝内置功能
dump()
<body>
{{ dump('your data', ['hello', 'world']) }}
</body>
它将在您调用它的位置生成并输出。是的,它会注入 HTML (+JS)
非破坏性,带有
{% dump %}
标签(需要安装 symfony/twig-bridge
)
注意:这是一个树枝标签,不是一个函数,所以不需要
()
!
<body>
{% dump some_variable, 'data as string', ['hello', 'world'] %}
</body>
它的行为与控制器中的
dump($data);
相同。它将输出移动到调试栏,因此您的布局保持不变。