3

我有一个 Sf2 应用程序,它带有一个扩展布局的树枝模板。在模板内部,我想使用 twig 的render标签填充一个块。不幸的是,该render标签会导致两个子请求,而不是预期的单个请求。但是,如果我将render标签放在块之外,一切正常*。

*当然,除了结果只是在页面顶部而不是在块内呈现,但这只是一个额外的子请求。

render当且仅当标签放置在一个块中时,什么可能导致发出两个子请求?


肮脏的细节

在布局中有一个额外的导航菜单(topmenu)块:

布局.twig.html

            <div class="row" id="secondary-nav">
                <div class="span12">
                    {% block topmenu %}{% endblock %}
                </div>
            </div>

重复子请求示例

这是我的观点,它使用标签通过向“导航”控制器发出子请求来{% render ... %}填充块:topmenu

index.html.twig

{% extends "FooBundle::layout.html.twig" %}

{% block topmenu %}
     {% render "FooBundle:Navigation:index" with { 'active': 'feedback' } %}
{% endblock %}

到目前为止,一切都很好,但是这样做子请求由于某种未知原因被发出了两次。它没有显示两次,但我看到 SQL 查询计数增加了,symfony2 分析器也显示了两个相同的子请求。

单个子请求示例

如果我将{% render ... %}标签放在这样的任何块之外,它只会导致一个子请求:

index.html.twig

{% extends "FooBundle::layout.html.twig" %}

{% render "FooBundle:Navigation:index" with { 'active': 'feedback' } %}

{% block topmenu %}
{% endblock %}
4

1 回答 1

3

纳尔夫!最后,在这个问题上花费了 X 小时后,我发现我在我的 中检查了layout.html.twigtopmenu块是否有任何内容:

{% if block('topmenu') %} ... {% endif %}
...
{% block topmenu %}{% endblock %}

这导致了第二个不需要的子请求。

使固定

为了仍然能够检查内容但不请求两次,我首先将块加载到变量中,然后输出变量而不是使用{% block topmenu ...%}

{% set topmenu = block('topmenu') %}
{% if topmenu %} ... {% endif %}
{{ topmenu | raw }}

幸运的是,我真的不需要扩展块,它只是一个占位符。

于 2012-11-30T09:37:51.173 回答