2016-04-26 116 views
2

我想根據角色製作一個動態菜單。現在,我將菜單作爲一個包含參數(角色)的宏包含在內,但我正在寫作測試角色,並且它可以工作。我無法從模板中的控制器獲取角色的價值。在symfony2中通過TWIG在所有模板中共享變量

事情是如何將用戶的角色(已經在控制器上)發送到佈局。

我讀了很多關於在樹枝中創建全局變量的可能性,這可以解決我的問題。

這是我的代碼:

# layout.html.twig # 
{% block menu %} 
    {{ userRole('admin') }} 
{% endblock %} 

這是工作,但正如我所說的,我不得不寫的角色。我需要獲得價值。

我也嘗試發送值作爲參數,但事情是在我正在渲染內容的控制器中,並且它擴展了佈局。

public function loginAction(){ 
$ldaprdn = $_POST['login'];  // ldap rdn or dn 
$ldappass =$_POST['pass']; 

$m = new Model(); 
$params = array('user' => $m->login($ldaprdn,$ldappass),); 

$me = new Model(); 
$user = array('user' => $me->getSettings(),); 

$this->render('::menu.html.twig',$user); 
return $this->render('intranetBundle:Default:landinga.html.twig', $user); 

}

這是我不能用大解決的唯一的事情。

任何可能的解決方案?也許建築設計不是最好的或者是某種東西。或者,也許我可以使用一些我不知道的工具...

重要的是要從任何模板中獲取角色的價值,從PHP到TWIG。一旦完成,問題就解決了。

回答

1

我看這樣做

  1. 可以使用is_granted函數來檢查樹枝角色,不從任何控制器 變量的幾種方法。 (simpliest)

  2. 可以使用渲染器渲染另一個樹枝內的枝條(不推薦,但有時 有用)

  3. 你可以重新定義基礎 模板的塊在控制器的模板
  4. 您可以讓所有的 控制器都插入一個全局控制器,該控制器通過您的基本模板中所需的所有 變量
+0

最後我使用了第二個選項。它在第一次嘗試時起作用。我用這個文檔引導自己:http:// symfony。com/doc/current/book/templating.html#embedding-controllers –

+0

請注意,在任何情況下使用它都是一個糟糕的解決方案。它對你的菜單或登錄個人資料圖片等小部件可能有好處,但不要把它用於一切的壞習慣。 (對於性能:它重做整個請求/響應鏈) – goto

0

試試這個:

{% set var = 'inner variable' %} 
My variable is {{ var }} 
0

什麼symfony的版本,你呢?

在Symfony \ Bundle \ FrameworkBundle \ Controller \ Controller中有方法getUser(),而且在樹枝模板中全局存在app.user變量。如果「角色」是在你的用戶的實體的財產,你可以通過app.user.role得到它的枝條

0

只要你的用戶的身份驗證設置正確,這樣的事情將正常工作:

{% if is_granted('ROLE_ADMIN') %} ... {% endif %}