2016-11-21 39 views
0

我有大的靜態主菜單,只有3個項目,我需要從數據庫中加載。這些項目有自己的孩子,讓他們在多維數組和每個項目需要自己選擇,以便選擇3倍3倍=多陣列。Symfony 3 - 沒有包的菜單

我認爲我不需要任何軟件包,因爲選擇此項目是快速和容易。 (+它是非標準的數據庫結構的項目,所以實施捆綁可能會更難)

但我是新的Symfony,所以我的問題是如何加載菜單項從數據庫在一個地方,然後發送它們來查看?我不想在每個控制器/方法中加載這些項目。

我已經嘗試過化妝樹枝延伸,但之後得到這個數組我需要重複它在PHP類建立HTML字符串...我認爲這是一個非常糟糕的主意......

回答

1

嫩枝擴展才是正道去這裏。但你不必須建立在PHP的HTML字符串(這的確是錯誤的)。您可以在擴展類中呈現Twig模板。

示例代碼:

<?php 
namespace AppBundle\Twig; 

class MenuExtension extends \Twig_Extension 
{ 

    public function __construct() //suitable dependecies here - probably Doctrine 
    { 
     //assign params to class properties 
    } 

    public function getName() 
    { 
     return 'menu_extension'; 
    } 

    public function getFunctions() 
    { 
     return [ 
      new \Twig_SimpleFunction('menuRenderer', [$this, 'menuRenderer'], [ 
       'needs_environment' => true, 
       'is_safe' => ['html'] 
      ]) 
     ]; 
    } 

    public function menuRenderer(\Twig_Environment $environment) 
    { 
      //do all the work to get data from DB 

      return $environment->render('AppBundle:Menu:main-menu.html.twig', array(
       //pass data to template 
     )); 
    } 
} 
+1

「細枝擴展是去這裏的正道」。這取決於你對你的架構的看法。如果你喜歡在你的模板中放置邏輯,那麼確定。但是,如果您不想在模板中放置太多邏輯來使其更容易維護,那麼您更願意使用正確的結構注入預處理的數組或對象。 –

+0

它總是依賴。 ;-)你也可以注入,將處理業務邏輯的服務。但是,如果它只是在庫調用的findAll比它不是一個邏輯。 –

+0

我剛剛在我的評論中發現了一個錯字,抱歉:「爲了使維護更容易」 - >「使它們更容易維護」:p –