2016-05-19 72 views
1

在我的Symfony項目中,當使用embedded Twig controllers時,我遇到了kernel.requestevent listeners多次觸發的奇怪問題。Embedded Twig控制器導致kernel.request事件觸發多次

在我的自定義事件偵聽器中,我有一個事件偵聽器,如果某個條件存在(在這種情況下是過期的密碼),它會發送重定向響應。爲了防止重定向循環,我檢查了我們是否已經在頁面上:

if ($event->getRequest()->get('_route') != 'user_change_password') { 
    $response = new RedirectResponse($this->router->generate('user_change_password')); 
    $event->setResponse($response); 
} 

但是,這並沒有阻止重定向循環。在我添加日誌記錄之前,我不知道嵌入式控制器會觸發kernel.request事件(事後很明顯,因爲這些嵌入式控制器通過發送「子請求」工作)。我有一個嵌入式控制器通過基本樹枝模板檢查任何警報消息並顯示它們。

鑑於上述,我怎麼能

  1. 能夠插入動態內容爲基本模板(即所有其他模板擴展),和
  2. 沒有kernel.request事件偵聽器觸發多次。

即使Symfony建議使用嵌入式控制器將該動態內容插入到基本模板中,這是否被認爲是不正確的做法?

創建Twig extension來解決這個問題會更好嗎?從我看到的情況來看,Twig擴展通常只用於簡單的東西,比如食譜中的price示例,但我不明白爲什麼它不適用於更復雜的數據庫連接的東西。我只是不確定如何做到這一點。

例如讚賞。


可能相關?:Symfony Controller executed multiple Time

+0

kernel.request是爲每個請求觸發的,這包括子請求,如{{render(controller('...'))}} –

+0

那是正確的,這就是我所說的。我試圖找到解決上述問題的解決方案,這是xabbuh提供的。 – user128216

回答

4

你可以做只有當事件偵聽器的主機請求執行重定向:

use Symfony\Component\HttpKernel\HttpKernelInterface; 

// ... 

if ($event->isMasterRequest() && $event->getRequest()->get('_route') != 'user_change_password') { 
    $response = new RedirectResponse($this->router->generate('user_change_password')); 
    $event->setResponse($response); 
} 

如果你還在勢必Symfony的2.3,你可以使用getRequestType()方法將其返回值與來自HttpKernelInterfaceMASTER_REQUEST常數(這就是isMasterRequest()內部所做的)進行比較:

use Symfony\Component\HttpKernel\HttpKernelInterface; 

// ... 

if (HttpKernelInterface::MASTER_REQUEST === $event->getRequestType() && $event->getRequest()->get('_route') != 'user_change_password') { 
    $response = new RedirectResponse($this->router->generate('user_change_password')); 
    $event->setResponse($response); 
} 
+0

賓果!這就是我喜歡的那種解決方案:簡單快捷。謝謝!有一件事:在Symfony3中,該方法顯然已被重命名爲'$ event-> getRequestType()'。另外,完整的命名空間('use'語句)是'Symfony \ Component \ HttpKernel \ HttpKernelInterface'。 – user128216

+0

我正在探索源,我找到了一個更簡單的方法。有一個名爲'isMasterRequest()'的事件方法在答案中進行確切的requestType比較。不知道這是什麼時候添加到Symfony,但它是一個首選的解決方案。 – user128216

+0

你說得對。該方法在Symfony 2.4中引入。我再次更新了我的答案,爲將來任何人絆倒了這一點。 – xabbuh