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

问题描述 投票:0回答:1

我想利用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
1个回答
3
投票

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>');

你会在调试栏中看到它

enter image description here

但是如果您发送“空”回复→您将看不到任何内容

$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);
相同。它将输出移动到调试栏,因此您的布局保持不变。

© www.soinside.com 2019 - 2024. All rights reserved.