我是Symfony2的新手,我一直在考虑生成每个页面请求使用的导航栏HTML的最佳方法 - 尤其是在缓存方面。
因此,想象一下,如果每个页面请求都显示登录用户,并且数字表示未读取的消息数量(实际上类似于stackoverflow)。我猜测可以在每个控制器中生成以确保信息是最新的(使用函数或当然) - 但我也在考虑缓存整个控制器输出,并认为它可能是好的保持这个动态部分分开。
为所有这些东西创建一个控制器扩展是一个好方法吗?因此,这种方式控制器仅处理该特定功能(例如,从DB等获取博客帖子),并且控制器扩展添加所有动态内容。这样我可以缓存控制器结果并加速页面而无需缓存整个页面(由于大量动态HTML内容而无法真正完成)。
这样的事情可能是:
class ControllerExtension extends Controller
{
public function render($view, array $parameters = array(), Response $response = null)
{
//get number of messages for this user
$parameters['messages'] =
//are they logged in
$parameters['logged_in'] =
// render as normal
return parent::render($view, $parameters, $response);
}
}
为此,我想忽略JS的使用。我知道其中一些东西可以填充JS,但我不想这样做。
答案 0 :(得分:4)
您可以通过使用ESI或Hinclude从页面html中分离缓存导航栏片段来解决此问题,并且可以使用Symfony2简单而优雅地解决。
在模板中嵌入控制器
您可以在模板中渲染控制器:
<div id="sidebar">
{% render url('latest_articles', { 'max': 3 }) %}
</div>
这将在你的html中为控制器提供路径“latest_articles
”。
这可以在您的控制器模板或全局布局模板中完成(您可以在其中定义所有页面的页眉,页脚,js,css ecc,请参阅Template Inheritance)
将嵌入的片段与页面html分开缓存:
您可以使用反向代理(如Varnish或AppCache)分别缓存html的两部分:
<div id="sidebar">
{% render url('latest_articles', { 'max': 3 }, {'standalone': true}) %}
</div>
就是这样,只需添加{'standalone': true}
您需要在Web服务器前面安装一个外部程序(如Varnish或带有mod的Nginx),但这是最快的方法。
使用javascript:
加载片段您还可以告诉symfony在javascript中异步加载片段:
<div id="sidebar">
{% render url('latest_articles', { 'max': 3 }, {'standalone': 'js'}) %}
</div>
这是一种很好的方法,因为您可以将整个html缓存在CDN中(例如使用Amazon CDN CloudFront),并且仍然显示用户特定的内容。
有关信息,请参阅:http://symfony.com/doc/2.1/book/templating.html#asynchronous-content-with-hinclude-js