2

假设我有一个这样的基本模板:

// 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 累积在一个地方。

使用扩展自下而上渲染在这里不是选项,因为模板由多个由不同控制器渲染的块组成。

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

4

3 回答 3

2

一切皆有可能,但从设计角度来看,这可能不是一个好主意。

当涉及到扩展时,该render标签非常有用,它被用作隔离请求的一种方式。每个render调用都被视为一个子请求,并且可以对其应用缓存策略。我强烈建议您阅读有关 HTTP 缓存的文档,尤其是有关 Edge Side Includes (or ESI)的部分。

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

您不应该与主请求交互,因为子请求是为缓存而隔离的(取决于您嵌入渲染标签的位置,主请求会有所不同,这意味着您可能会得到一些意想不到的结果)。

首先,我会创建一个所有其他页面都扩展的布局模板。布局模板将声明所有基本块(javascript、css、页脚、页眉、、<head>-<body>如果需要,您可以在更多模板中抽象)。

如果您的页脚或页眉有逻辑,请将它们拆分为 Twig 函数(或过滤器)并在 Twig 中处理逻辑,但要保持简洁(如果它太复杂或太意大利面条,则意味着还有另一种方法)。

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

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

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

于 2013-07-19T16:51:59.910 回答
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#include-javascript-files

于 2013-07-20T03:50:28.613 回答
0

正是@Pazi 在评论中所说的:你需要一个控制器吗?只包含模板本身看起来很简单,而不使用控制器。

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

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

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

于 2013-07-19T15:02:15.250 回答