1

イベントリスナー/サブスクライバーで既知の小枝ブロックを拡張する方法を見つけようとしています。

コードは非常に基本的です。

主な小枝:

<!doctype html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>Hello World</title>
</head>
<body>

{% block body %}{% endblock %}

{% block javascripts %}{% endblock %}

</body>
</html>

ご覧のとおり、body と javascripts の 2 つのブロックを持つ単純な html です。

たとえば、イベント リスナー onKernelResponse があります。ここで欲しいのは、twig の「extends」を使用して「javascripts」ブロックに新しい JavaScript を追加できるようにすることです。

コードは次のようになります。

public function onKernelResponse(FilterResponseEvent $event)
{
    if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
        return;
    }

    $response = $event->getResponse();

    //complete guesswork code to illustrate what I'm trying to achieve

    $content =  $this->twig->extend( //extend() function is imaginary
        $response, //pass in current response
        'AcmeBundle:Javascript:index.html.twig',
    );
    $response->setContent($content);
}

$this->twig->extend は $this->twig->render のように機能するはずですが、何か新しいものをレンダリングする代わりに、extend() は $response を受け取り、'AcmeBundle:Javascript:index.html. 「javascripts」ブロックにコンテンツを追加できます。

「AcmeBundle:Javascript:index.html.twig」の例を次に示します。

{% block javascripts %}
    {{ parent() }}

    <script>
        var something = "new";
    </script>
{% endblock %}

基本的に、イベントリスナーで小枝ブロックをプログラムで拡張する方法を探しています。

事前に助けてくれてありがとう。

4

1 に答える 1

0

イベントリスナーに twig グローバル変数を登録して、ブロックを拡張するかどうかを示すことができます。

eval...または、 twig のtemplate_from_string()関数を使用するのと似たテンプレート コードとして、イベント リスナーに登録されたグローバル変数を含めることができます。

{% block javascripts %}
    {{ parent() }} 
    {{ include(template_from_string(global_variable_name|default(''))) }}
{% endblock %}
于 2013-08-06T02:33:55.463 に答える