Symfony2在事件监听器中扩展Twig块

时间:2013-08-06 01:06:03

标签: events symfony twig event-listener

我正试图找到一种方法来扩展事件监听器/订阅者中的已知twig块。

代码非常基础。

主要树枝:

<!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>

正如你所看到的,它只是一个带有2个块的简单html:body和javascripts。

现在我举例说明了一个关于KernelResponse的事件监听器。我想要的是能够使用twig的“扩展”向“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-&gt; twig-&gt;扩展应该像$ this-&gt; twig-&gt; render一样工作,但是不应该渲染新的东西,extend()应该接受$ response并使用'AcmeBundle扩展它:Javascript:index.html.twig'我可以在其中添加更多内容到“javascripts”块。

以下是“AcmeBundle:Javascript:index.html.twig”的示例:

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

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

基本上我正在寻找一种在事件监听器中以编程方式扩展twig块的方法。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您可以在事件侦听器中注册一个twig全局变量,以指示是否扩展该块。

...或者您可以使用twig的template_from_string()函数将在事件监听器中注册的全局变量包含为与eval有些类似的模板代码。

{% block javascripts %}
    {{ parent() }} 
    {{ include(template_from_string(global_variable_name|default(''))) }}
{% endblock %}