说我有这样的基本模板:
// 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累积在一个地方。
由于模板由以下内容组成,因此无需在此处自上而下进行扩展 由不同控制器呈现的多个块。
这有可能吗?或者有更好的方法吗?
答案 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块的基本模板。然后在页眉和页脚中扩展该基本模板文件。或者只是在其中包含基本模板也应该有效。