Symfony2:渲染内部块会导致重复的子请求

时间:2012-11-30 01:54:46

标签: symfony twig

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

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

如果 - render标记位于某个区块内,可能会导致发出两个子请求?


DIRTY DETAILS

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

layout.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 %}

1 个答案:

答案 0 :(得分:3)

NARF!最后,在这个问题上花了X个小时之后,我发现我的layout.html.twig检查了topmenu块是否有任何内容:

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

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

<强>修正

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

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

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