2016-07-27 90 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 }