如何使 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/