2017-09-25 147 views
0

如何指定一組控制器(例如管理員部分的所有控制器)並分配一個變量或服務,這些變量或服務可以在這些控制器呈現的所有模板中訪問?如何將變量傳遞給Symfony 3中多個控制器的模板?

Laravel中的一個等價物將爲不同的路由組指定不同的中間件。

我不是在尋找這些問題的答案:

  1. 全局變量 - 變量/服務將不必要地注入一些控制器

  2. 嵌入(例如前端控制器)。模板中的其他控制器 - 緩慢,冗長和重複的解決方法。

+0

你能顯示你的代碼嗎? –

+1

Symfony控制器通常會返回模板的響應版本,因此中間件沒有空間。通常,當Symfony控制器返回響應時,它是一個完全分析的字符串。如果你希望能夠在控制器之後處理它,你需要返回一些參數來標識模板,然後設置一個'Kernel :: Response'監聽器來處理額外的參數以及實際創建的響應目的。 – qooplmao

+1

我可以想到的兩個選項,你基本上都說他們兩個 1)服務 - 有一個函數來獲得變量,如果用戶有權限,或請求是正確的URL /控制器等 2 )中間件 - 使用事件偵聽器在正確的請求上設置變量。 –

回答

1

要指定控制器,你想傳遞一個額外的PARAM,讓我們做它實現了一些接口像AdminInterface.Then通過PARAMS查看,有幾種方法:

1 /監聽器內核.view:

public function onKernelView(GetResponseForControllerResultEvent $event) 
    { 
     $result = $event->getControllerResult(); 

     if (!$result instanceof AdminInterface || !isset($result['template']) || !isset($result['data'])) { 
      return; 
     } 

     $data = array_merge($result['data'], array('myvar' => 'value')); 
     $rendered = $this->templating->render($result['template'], $data); 

     $event->setResponse(new Response($rendered)); 
    } 

2 /傳遞一個屬性包含您的PARAMS的請求和$請求 - >屬性 - > GET得到它在你的控制器(「myVar的」),並直接把它傳遞給模板。

public function onKernelController(FilterControllerEvent $event) 
{ 
    $controller = $event->getController(); 
    if (!$result instanceof AdminInterface) { 
     return; 
    } 
    $event->getRequest->attributes->set('myvar', 'value'); 
} 

有關symfony內核事件的更多詳細信息請看doc。 希望能幫到你。

相關問題