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>

如您所见,它只是一个带有 2 个块的普通 html:body 和 javascripts。

例如,现在我有一个事件监听器 onKernelResponse。我在这里想要的是能够使用树枝的“扩展”将新的 javascript 添加到“javascripts”块中。

代码可能类似于:

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 扩展它。 twig' 我可以在其中向“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 回答