为什么twig的渲染函数会创建一个子请求

时间:2014-01-03 07:21:14

标签: symfony twig

为什么twig的渲染功能会创建子请求?为什么他们只是渲染响应并将其作为响应的一部分发送?

此外,我可以看到在主模板显示后,呈现的响应出现在浏览器中。它是如何发生的?

3 个答案:

答案 0 :(得分:2)

我创建了an answer on Stackoverflow,它基本上经历了render函数的不同选择。

它还解释了为什么您应该使用render函数而不是常规include

我建议你阅读关于embedding controllers in Twig的章节。关于何时应该考虑使用render函数的文档中有趣的引用:

  

每当您发现需要在模板中无法访问的变量或信息时,请考虑渲染控制器。

TL; DR

默认情况下,render函数只接受一个URL(绝对或相对)。

通过类比,它就像通过ajax获取HTML并将其注入页面中:一个请求查询控制器以获取一些HTML,并将其注入页面。

render个调用,如render_esi(支持ESI标记),它们有自己的渲染策略。如果您从内联渲染开始(通过默认的render函数),您将有机会使用其他渲染策略,而无需重构您的代码。

render功能旨在扩展您的应用。

有关其实用性的更多详细信息,请查看render_esi函数。

使用render_esi功能,您可以实施ESI tags以与Varnish一起使用。

(除了Varnish之外还有其他解决方案,但它是最受欢迎的解决方案之一)

Varnish是一种位于Web服务器和用户之间的缓存解决方案。 Varnish将过滤来自您的Web服务器的响应,缓存整个页面,然后查找这些ESI标签。

如果Varnish将您的页面缓存了一天,但render_esi函数被设置为缓存2小时,则Varnish将仅查询(通过缓存过期时的URL)这些特定的渲染调用而不是整个页面(这就是render_esi执行子请求的原因)并用子请求的响应替换部分模板。

一般来说,缓存非常有趣且非常广泛,因此很难回答我的答案中的每一个细节,但我希望我的回答对您有帮助。

根据Wikipedia缓存(或缓存):

  

在计算机科学中,缓存(/kæʃ/ kash)[1]是一个透明地存储数据的组件,以便可以更快地提供对该数据的未来请求。

答案 1 :(得分:1)

当您不仅想要包含其他模板片段,而且还想要执行属于此模板的特定businesslogic时,将使用

Render。换句话说:当仅包含不够时,使用渲染。

因为render不仅包含模板,而且还执行控制器逻辑,因此它被封装为子请求。

想象一下,您希望在网站的每个页面的框中显示最新消息。如果您想使用include解决此问题,则必须在每个操作中获取最新消息并将其传递给模板。

但是如果你使用渲染,你只需为此编写一个动作,并在模板中的任何地方放置一个渲染标记,你想要有这个新闻框。 render标签执行关联的控制器操作,呈现响应,并将其注入当前模板。

因为我很难解释,你可能还想阅读symfony doc的这一部分:http://symfony.com/doc/current/book/templating.html#embedding-controllers

答案 2 :(得分:1)

在我看来,答案听起来应该是这样的:

  1. 控制器是非常简单的“单元”,它接收请求并发送响应。
  2. 为渲染控制器创建子请求可为您提供更多功能(灵活性)。
  3. 关于灵活性。看看你的控制器,就像它只是收到请求并发送响应,例如,你想以某种方式过滤请求或装饰响应?你会把这个逻辑放在哪里?当然,在事件监听器上可以使用其他服务来解决这个任务。

    例如,我经常为my controllers使用参数转换器(这不是关于好的设计,仅举例)。那么我怎样才能使用“render”,只指定我的实体的id,只渲染控制器而不创建子请求?

    如果您真的只想渲染一些数据,可以使用“include”或创建扩展名。或者您可以创建扩展来呈现控制器而不需要子请求,但请仔细考虑,因为您可以进一步添加更多逻辑来过滤响应等等。

    我错了,这只是我的意见;)