3

レイアウトを拡張する小枝テンプレートを備えたSf2アプリケーションがあります。renderテンプレート内で、小枝のタグを使用してブロックを埋めたいと思います。残念ながら、renderタグは予想される単一のサブリクエストではなく、2つのサブリクエストを引き起こします。しかし、renderタグをブロックの外側に配置すると、すべてが正常に機能します*。

*もちろん、結果がブロック内ではなくページの上部に表示されることを除いて、追加のサブリクエストは1つだけです。

renderタグがブロック内に配置されている場合にのみ、2つのサブリクエストが行われる原因は何ですか?


汚い詳細

レイアウトには、追加のナビゲーションメニュー用のブロックがあります(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 %}

これまでのところ、とても良いですが、このようにすると、なんらかの理由でサブリクエストが2回発行されます。2回表示されていませんが、SQLクエリ数が増え、symfony2プロファイラーにも2つの同一のサブリクエストが表示されています。

単一のサブリクエストの例

このようなブロックの外側にタグを配置する{% render ... %}と、1つのサブリクエストのみが発生します。

index.html.twig

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

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

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

1 に答える 1

3

NARF!最後に、この問題にX時間費やした後、ブロックに内容が含まれているかlayout.html.twigどうかを確認するために、をチェックインしたことがわかりました。topmenu

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

これにより、2番目の不要なサブリクエストが発生しました。

修理

コンテンツをチェックできるが、2回リクエストしないようにするために、最初にブロックを変数にロードしてから、次を使用する代わりに変数を出力します{% block topmenu ...%}

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

幸い、ブロックを実際に拡張する必要はありません。単なるプレースホルダーです。

于 2012-11-30T09:37:51.173 に答える