我有一个Sf2应用程序,其中有一个扩展布局的树枝模板。在模板内部,我想使用twig的render
标记来填充块。不幸的是,render
标记会导致两个子请求,而不是预期的单个请求。但是,如果我将render
标记放在块之外,那么一切正常*。
*当然除了结果只是在页面顶部而是在一个块内呈现,但它只是一个额外的子请求。
如果 - render
标记位于某个区块内,可能会导致发出两个子请求?
在布局中有一个附加导航菜单(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 %}
答案 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 }}
幸运的是,我不需要真正扩展块,它只是一个占位符。