2014-09-30 85 views
0

我的網站有一個菜單,我只希望能夠根據用戶權限顯示鏈接。需要保留代碼清潔的樹枝自定義功能

菜單例如:

<ul> 
    <li>Dashboard</li> 
    <li>Products</li> 
    <li>Suppliers</li> 
</ul> 

在枝杈我目前不必重複代碼來完成我做·需要什麼。我不喜歡這樣做!

我首先檢查用戶是否是管理員,如果他們再然後自動獲得所有的鏈接...

{% set is_admin = false %} 
    {% if app.security.token.user.roles is iterable %} 
     {% for role in app.security.token.user.roles %} 
      {% if role == 'ROLE_ADMIN' or role == 'ROLE_SUPER_ADMIN' %} 
       {% set is_admin = true %} 
      {% endif %} 
     {% endfor %} 
    {% endif %} 

這是我的菜單設置當前。我需要能夠根據用戶角色和權限驗證鏈接是否可以顯示。這只是模擬鏈接,但實際上我可以有50個以上的鏈接,所以你可以看到這不是一個正確的方法來做到這一點。

任何建議將非常歡迎如何創建一個功能在小枝(不知道任何方式來做到這一點)或建議任何其他可能的方式。我只需要有一個可重用的功能。

<ul> 
    {% set is_dashboard = false %} 
    {% for role in app.user.roles %} 
     {% for roleAuth in role.appRoleAuthorizations %} 
      {% for roleAuthRoute in roleAuth.appRoleAuthorizationRoute %} 
       {% if roleAuthRoute.name == "dashboard" or is_admin %} 
        {% set is_dashboard = true %} 
       {% endif %} 
       {% if not loop.last %}{% endif %} 
      {% endfor %} 
      {% if not loop.last %}{% endif %} 
     {% endfor %} 
     {% if not loop.last %}{% endif %} 
    {% endfor %} 
    {% if is_dashboard == true %} 
      <li>Dashboard</li> 
    {% endif %} 


    {% set is_products = false %} 
    {% for role in app.user.roles %} 
     {% for roleAuth in role.appRoleAuthorizations %} 
      {% for roleAuthRoute in roleAuth.appRoleAuthorizationRoute %} 
       {% if roleAuthRoute.name == "product" or is_admin %} 
        {% set is_products = true %} 
       {% endif %} 
       {% if not loop.last %}{% endif %} 
      {% endfor %} 
      {% if not loop.last %}{% endif %} 
     {% endfor %} 
     {% if not loop.last %}{% endif %} 
    {% endfor %} 
    {% if is_products == true %} 
      <li>Products</li> 
    {% endif %} 

    {% set is_suppliers = false %} 
    {% for role in app.user.roles %} 
     {% for roleAuth in role.appRoleAuthorizations %} 
      {% for roleAuthRoute in roleAuth.appRoleAuthorizationRoute %} 
       {% if roleAuthRoute.name == "supplier" or is_admin %} 
        {% set is_suppliers = true %} 
       {% endif %} 
       {% if not loop.last %}{% endif %} 
      {% endfor %} 
      {% if not loop.last %}{% endif %} 
     {% endfor %} 
     {% if not loop.last %}{% endif %} 
    {% endfor %} 
    {% if is_suppliers == true %} 
      <li>Suppliers</li> 
    {% endif %} 

</ul> 

回答

2

爲什麼不使用Symfony的內置{% is_granted() %} Twig函數?這裏是the doc。使用它應該使你的模板更清潔一點。

至於建立菜單,沒有必要在模板中這樣做,因爲這會破壞單一責任原則。

首先,您應該考慮使用KnpMenuBundle,因爲它允許您動態生成菜單,這些菜單可能基本上取決於可通過服務容器訪問的任何參數。菜單本身通常使用EventListeners構建,這爲您提供了很大的靈活性。

如果添加捆綁軟件不適合您,那麼您爲什麼不將自己在模板中生成的檢查提取到服務中?它可以訪問您的項目中幾乎任何價值。您只需傳遞當前上下文和用戶,然後獲取可用於模板的布爾值數組或對象。