symfony - 特定路由上的ESI缓存

标签 symfony varnish esi

如何使 Varnish 以不同的状态缓存动态菜单?

我当前的项目(基于Symfony 2.8)使用KnpMenuBundle和varnish来缓存页面。它还使用ESI来禁用对某些页面上的一个特定元素的缓存。其中包括菜单。但是由于这不是一个变化很大的元素,所以我想知道是否有可能缓存菜单的不同状态并将相关的状态传递给当前调用菜单的页面。

涉及的主要文件如下:

main.html.twig

{{ render_esi(controller('AppBundle:Menu:mainESI')) }}

AppBundle\Controller\MenuController.php
    public function mainESIAction($path = null)
    {
        return $this->render('menu/main_menu_esi.html.twig', [
            'path' => $path
        ]);
    }

menu/main_menu_esi.html.twig
    {{ knp_menu_render('main-menu', {'template':'menu/main_menu.html.twig'}) }}

最佳答案

你不能

对于Varnish,网址将是相同的,因此它将呈现相同的内容。

在外部应用逻辑并向您的路线添加参数:

{% if is_granted('ROLE_ADMIN') %}
    {% set menu_mode = 'admin' %}
{% else %}
    {% set menu_mode = 'normal' %}
{% endif %}

{{ render_ssi(controller('AppBundle:Menu:mainESI',{'menu_mode':menu_mode}))  }}

关于symfony - 特定路由上的ESI缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38616785/

相关文章:

php - 在 Symfony2 中将 SecurityContext 注入(inject)监听器 prePersist 或 preUpdate 以获取 createdBy 或 updatedBy 中的用户导致循环引用错误

php - Symfony 中多个地址的一种形式 - Twig

varnish - 恢复已加载的Varnish配置

symfony - 将 Edge Side Includes 放入我的模板中是一个好习惯吗?

symfony - 如何使 Controller url 的缓存无效?

php - 从 symfony 中的 cron 任务发送电子邮件

ubuntu - 以 root 身份启动 Varnish 的说明?

apache - 使用 Varnish 将图像请求重写到 CDN URL

zend-framework - 使用Varnish/ESI和Zend框架的缓存和页面 View

php - Goutte-dom爬虫-移除节点