2016-07-27 75 views
1

如何获取清漆以缓存处于不同状态的动态菜单?特定路径上的ESI缓存

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

涉及的主要文件如下:

main.html.twig

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

的appbundle \控制器\ MenuController.php

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

菜单/ main_menu_esi.html.twig

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

回答

1

你不能。

对于清漆,网址将是相同的,所以它会呈现相同。

外应用你的逻辑和参数添加到您的路线:

{% 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})) }} 
+0

感谢您的回答。我需要一个确认。 :) – thoroc

2

我不知道有足够的了解Symfony的,但在一般情况下,如果你能得到饼干需要的状态,你可以试试这样的场景:

中的recv

():

  • 解析Cookie头和提取您的状态,以自定义请求HTTP头,让我们说 “X-菜单模式:管理”
  • 滴所有Cookie

哈希():

  • 添加页眉哈希(有URL和主机默认据我所知)
小姐/通(3

。 x)或backend_fetch(4.x的):在从bereq

  • 重构Cookie头部的X菜单模式
  • 从bereq下降X菜单模式

我已经使用这个方案取得了巨大成功。 ESI包含的片段现在可以完全缓存,并且每个独特的cookie值都有不同的版本。

1

所以这毕竟是可能的。我需要的解决方案是下列操作之一:

  1. 通过树枝传递当前的路径:

的appbundle /资源/视图/ base.html文件。TWIG

{{ render_esi(controller('AppBundle:Menu:mainESI', { 'currentPath': currentPath })) }} 
  • 获取TE控制器动作的变量:
  • 的appbundle /控制器/ MenuAdminController.php

    public function mainESIAction($currentPath = null) 
    { 
        return $this->render('menu/main_menu_esi.html.twig', [ 
         'currentPath' => $currentPath, 
        ]); 
    } 
    
  • 使用匹配器/选举器类别:
  • AppBundle /匹配器/选民/ PathVoter.php

    <?php 
    
    namespace AppBundle\Matcher\Voter; 
    
    use Knp\Menu\ItemInterface; 
    use Knp\Menu\Matcher\Voter\VoterInterface; 
    use Symfony\Component\HttpFoundation\RequestStack; 
    
    /** 
    * Class PathVoter 
    */ 
    class PathVoter implements VoterInterface 
    { 
        protected $uri; 
    
        /** 
        * @param RequestStack $requestStack 
        */ 
        public function setRequest(RequestStack $requestStack) 
        { 
         if (($request = $requestStack->getCurrentRequest())) { 
          $pathInfo = $request->getPathInfo(); 
          $requestUri = $request->getRequestUri(); 
    
          if (!empty($pathInfo) && '/_fragment' === $pathInfo && !empty($request->attributes->get('currentPath'))) { 
           $this->uri = $request->attributes->get('currentPath'); 
          } else { 
           $this->uri = $pathInfo; 
          } 
         } 
        } 
    
        /** 
        * @param ItemInterface $item 
        * @return bool|void 
        */ 
        public function matchItem(ItemInterface $item) 
        { 
         $uri = $item->getUri(); 
    
         if ((null === $this->uri) || (null === $uri)) { 
          return; 
         } 
    
         if ($item->getUri() === $this->uri) { 
          return true; 
         } 
    
         return; 
        } 
    } 
    
  • 注册选民
  • 的appbundle /资源/配置/ services.yml

    parameters: 
        app.menu.voter.class: AppBundle\MenuBundle\Matcher\Voter\PathVoter 
    
    services: 
        app.menu.voter: 
        class: %app.menu.voter.class% 
        calls: 
         - [setRequest, [@request_stack]] 
        tags: 
         - { name: knp_menu.voter }