如何让Twig的dump函数展开显示数据?

7
我正在使用Twig的dump函数。但它显示的数据是"折叠"的,就像这里一样:

Twig Dump Folded

当我点击箭头时,我可以通过展开数据来揭示它,就像这里一样:

Twig Dump Unfolded

问题:

有没有办法告诉twigdump直接显示完全展开的对象。


你的意思是说你不想让它能被点击吗?我指的是完全展开,而且不折叠? - Alvin Bunk
2
不是真的。我可以接受它是“可折叠的”。但是我计划显示大约5到6级深度的复杂对象,每个级别大约有3到5个属性。完全展开对象很容易需要10或20次点击。我想一次性显示所有数据,而不需要用户点击每个部分。因此,问题集中在如何“无需要求用户点击”显示所有内容,而不是如何“防止用户点击”。 - Xavi Montero
7个回答

4
你可以用JavaScript(jQuery)来实现这个功能:
    // Expand all dump levels of all sf-dumps on a page.
    $("pre.sf-dump").each(function() {
        $(this).find("a.sf-dump-toggle:gt(0)").each(function(i, a){
            a.click();
        });
    })

这将模拟用户在页面上单击每个sf-dump的每个转储切换(不包括第一个使用gt(0)的切换)。
编辑:我添加了一个each()函数,使脚本适用于页面上可能存在的任何数量的sf-dump。感谢@Xavi

1
好的,谢谢你的提示!这只适用于每页只有一个转储的情况,如果有多个转储,则不适用。以你的答案为基础,我修改了选择器以打开“所有箭头”,除了那些“第一级”的箭头,使用 $( "a.sf-dump-toggle" ).not( "pre.sf-dump > a.sf-dump-toggle" ).each( [...] - 请将此内容合并到你的答案中以便选择和点赞。 - Xavi Montero
我调整了脚本,与您的版本有点不同,但我认为它们都很好 :) - Graftak

3
一种快速的方法是在您的CSS中添加以下内容:
pre.sf-dump .sf-dump-compact {
    display: block;
}

箭头将不再起作用。但是,如果您不关心切换,可以使用此CSS规则隐藏它们:
.sf-dump-toggle {
    display: none;
}

2
一旦您已经转储了数据,您需要在根节点上按Ctrl +左键单击。"最初的回答"

1
你可以创建自己的转储服务,并使twig使用它,而不是twig-bridge扩展默认使用的服务。
首先,创建自己的服务类,扩展实际的:
namespace App\Services;

use Symfony\Component\VarDumper\Dumper\HtmlDumper;

class MyHtmlDumper extends HtmlDumper
{
    public function __construct($output = null, string $charset = null, int $flags = 0) {
        parent::__construct($output, $charset, $flags);
        $this->setDisplayOptions(['maxDepth' => 3]);
    }
}

其次,让twig-bridge使用它。在services.yaml中,在services:下面添加:

    var_dumper.html_dumper: '@App\Services\MyHtmlDumper'

就是这样了!

您可以选择另一个值作为maxDepth,或更改其他选项。


在使用Sf 3.4时,我必须按照以下方式声明服务:var_dumper.html_dumper:############### class: 'AppBundle\Twig\CustomHtmlDumper' - Roubi

1
为了使对象完全折叠,使用此jQuery代码片段:
$(".sf-dump-expanded").removeClass("sf-dump-expanded").addClass("sf-dump-compact");

0

编辑:这是针对php dump()函数的。关于twig的,请参见我的其他答案

要影响php dump()函数,您可以设置变量转储器的显示选项:

VarDumper::setHandler(function ($var) {
    $cloner = new VarCloner();
    $dumper = 'cli' === PHP_SAPI ? new CliDumper() : new HtmlDumper();
    $dumper->setDisplayOptions(['maxDepth' => 3]);     

    $dumper->dump($cloner->cloneVar($var));
});

请查看https://symfony.com/doc/current/components/var_dumper/advanced.html


我认为在Twig视图中使用{{ dump() }}时会出现问题。 - Roubi
你说得对!已经编辑过了,并且添加了另一个答案,谢谢。 - Pierre-Olivier Vares

-1

我不确定你在图片中展示的是什么,但假设它是一个旅游实体。那么你可以通过你的setter和getter访问并在dump中显示。所以在上面的例子中,你展示了Tour对象并将其转储到Twig中。Tour实体可能有一个getTourId()类型的方法。

因此,要在你的twig中显示,你可以这样做:

{{ dump(tour.getTourId) }}

当你看到多个级别时,它很可能是一个数组集合。然后你需要获取子实体并调用它的方法。比如说,一个旅游实体有一个日期集合(一个日期实体),也许日期实体有一个getDate()函数。

那么你就可以这样调用:

{{ dump(tour.getDate[0].getDate) }}

getDate [0] 是 Tour 对象中日期数组集合的第一个元素。该元素是一个对象,因此需要调用其方法getDate

这就是 Twig 的操作方式。它全部基于对象,并且非常易于使用。通常不使用 dump。在生产环境中不建议使用,因为用户可能会看到著名的500错误页面。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接