1

我是 Symfony2 的新手,我一直在考虑生成用于每个页面请求的导航栏 HTML 的最佳方法——尤其是在缓存方面。

所以想象一下,如果每个页面请求都显示登录用户和一个指示有多少消息未读的数字(实际上就像 stackoverflow 那样)。我猜这可以在每个控制器中生成以确保信息是最新的(当然使用函数或其他东西) - 但我也在考虑缓存整个控制器输出,并认为它可能很好保持这个动态部分分开。

为所有这些东西创建一个控制器扩展是一个好方法吗?所以这种方式控制器只处理特定的功能(例如从数据库中获取博客文章等),控制器扩展添加所有动态内容。这样我就可以缓存控制器结果并加快页面速度,而无需缓存整个页面(由于大量动态 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 填充,但我不希望这样做。

4

1 回答 1

4

您可以通过使用ESI或 Hinclude将导航栏片段与页面 html 分开缓存来解决此问题,并且可以使用 Symfony2 简单而优雅地解决。

在模板中嵌入控制器

您可以在模板中渲染控制器:

<div id="sidebar">
    {% render url('latest_articles', { 'max': 3 }) %}
</div>

latest_articles这将在您的 html 中呈现带有路由“”的控制器。

这可以在您的控制器模板或全局布局模板中完成(您可以在其中定义所有页面的页眉、页脚、js、css ecc,请参阅模板继承

将嵌入的片段与页面 html 分开缓存:

您可以使用反向代理(如VarnishAppCache)分别缓存 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

于 2013-05-05T18:33:07.517 回答