为什么twig的渲染功能会创建子请求?为什么他们只是渲染响应并将其作为响应的一部分发送?
此外,我可以看到在主模板显示后,呈现的响应出现在浏览器中。它是如何发生的?
答案 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)
Render。换句话说:当仅包含不够时,使用渲染。
因为render不仅包含模板,而且还执行控制器逻辑,因此它被封装为子请求。
想象一下,您希望在网站的每个页面的框中显示最新消息。如果您想使用include解决此问题,则必须在每个操作中获取最新消息并将其传递给模板。
但是如果你使用渲染,你只需为此编写一个动作,并在模板中的任何地方放置一个渲染标记,你想要有这个新闻框。 render标签执行关联的控制器操作,呈现响应,并将其注入当前模板。
因为我很难解释,你可能还想阅读symfony doc的这一部分:http://symfony.com/doc/current/book/templating.html#embedding-controllers
答案 2 :(得分:1)
在我看来,答案听起来应该是这样的:
关于灵活性。看看你的控制器,就像它只是收到请求并发送响应,例如,你想以某种方式过滤请求或装饰响应?你会把这个逻辑放在哪里?当然,在事件监听器上可以使用其他服务来解决这个任务。
例如,我经常为my controllers使用参数转换器(这不是关于好的设计,仅举例)。那么我怎样才能使用“render”,只指定我的实体的id,只渲染控制器而不创建子请求?
如果您真的只想渲染一些数据,可以使用“include”或创建扩展名。或者您可以创建扩展来呈现控制器而不需要子请求,但请仔细考虑,因为您可以进一步添加更多逻辑来过滤响应等等。
我错了,这只是我的意见;)