Twig:渲染Symfony2控制器,扩展父模板中的块

时间:2013-07-19 14:52:02

标签: symfony twig

说我有这样的基本模板:

// Default/index.html.twig
{% block javascripts %}
    <script>//some script</script>
{% endblock %}

<div>
    {{ render(controller(MyControllerBundle:Default:header)) }}
</div>
{{ text }}
<div>
    {{ render(controller(MyControllerBundle:Default:footer)) }}
</div>

这会使控制器具有以下模板:

// Default/header.html.twig
Header content
{% block javascripts %}
   <script>//some additional scripts from the header</script>
{% endblock %}

// Default/footer.html.twig
Footer content
{% block javascripts %}
   <script>//some additional scripts from the footer</script>
{% endblock %}  

是否有可能以某种方式使用父模板中渲染的子控制器中的javascripts块? 我希望将所有javascripts累积在一个地方。

由于模板由以下内容组成,因此无需在此处自上而下进行扩展 由不同控制器呈现的多个块。

这有可能吗?或者有更好的方法吗?

3 个答案:

答案 0 :(得分:2)

任何事情都是可能的,但在设计方面它可能不是一个好主意。

render标记在缩放时非常有用,它用作隔离请求的方法。每个render调用都被视为子请求,并且可以对其应用缓存策略。 我强烈建议你阅读documentation about HTTP caching,特别是关于Edge Side Includes (or ESI)的部分。

当您使用render标记时,请将其视为要包含在多个页面中并最终缓存的模块。

您不应该与主请求交互,因为子请求被隔离以进行缓存(取决于您嵌入渲染标记的位置,主请求将不同,这意味着您可能会得到一些意外结果)。

首先,我要为每个其他网页extends创建一个布局模板。布局模板将声明所有基本块(javascript,css,footer,header,<head><body> - 如果需要,可以抽象更多模板。

如果您的页脚或标题的逻辑分割为Twig函数(或过滤器)并处理Twig中的逻辑但保持亮(如果它太复杂或太意大利面,这意味着还有另一种方式)。

避免每页有多个Javascript或CSS文件。如果你有一些css或javascript出现在某些页面而不是所有页面上,那么将它们合并到一个文件中可能是个好主意(在客户端更少的DNS调用,一旦它被缓存,加载页面会更快) 。 如果您有administrator.js种类的文件,那么您可以将其作为单独的文件包含在内,但如果大多数请求来自管理员,那么您可能希望将其包含在所有其他文件中。

如果您不知道可以将资产(js或css)合并到一个文件中:Symfony documentation中的更多信息。

我没有回答你的“如何”问题,因为我强烈建议你不要实施这样的系统,但我相信我已经分享了很好的指导方针来做出明智的决定。

答案 1 :(得分:1)

在TWIG中扩展/呈现其他内容时,您可以调用父块:http://twig.sensiolabs.org/doc/functions/parent.html

这意味着您可以保留默认值并在页眉/页脚定义

{% block javascripts %}
    {{ parent() }}
    {# other scripts #}
{% endblock javascripts %}

我建议您为页脚添加不同的块名称 - 这样您就可以在标题之外包含脚本。

此外,最好将脚本保存在一个地方 - 这样您就可以在以后使用资产重写:http://symfony.com/doc/current/cookbook/assetic/asset_management.html#including-javascript-files

答案 2 :(得分:0)

@Pazi在评论中说的话:你需要一个控制器吗?在不使用控制器的情况下单独包含模板看起来非常简单。

您可以使用include标记来包含子模板。

{% include 'MyControllerBundle:Default:header.html.twig' %}

为了从渲染的子控制器重用javascript块,您可以创建一个包含javascripts块的基本模板。然后在页眉和页脚中扩展该基本模板文件。或者只是在其中包含基本模板也应该有效。