2016-11-21 8 views
0

私はデータベースからロードする必要がある3つの項目だけを持つ大きな静的メインメニューを持っています。これらのアイテムには独自の子があり、多次元配列であり、各アイテムには3x select = 3x multi arrayという独自の選択が必要です。symfony 3 - バンドルなしのメニュー

この項目を選択するのはすばやく簡単なので、バンドルは必要ありません。 (+それは非標準db構造のプロジェクトなので、実装バンドルはもっと難しいかもしれません)

私はsymfonyで新しくなっていますので、私の質問はどのようにしてdbから1つの場所にメニュー項目を読み込み、 ?私はすべてのコントローラ/メソッドでこのアイテムをロードしたくありません。私はそれを反復処理し、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

"小枝拡張はここに行くための正しい方法です"。それはあなたのアーキテクチャのビジョンにかかっています。あなたのテンプレートにロジックを入れたいのであればOKです。しかし、テンプレートをあまりにも多くのロジックをテンプレートに入れたくない場合は、あらかじめ処理された配列やオブジェクトを適切な構造で注入することをお勧めします。 –

+0

それは常に依存します。 ;-)ビジネスロジックを処理するサービスを注入することもできます。しかし、それは単にそれがロジックではなく、リポジトリのfindAllコールです。 –

+0

私のコメントの誤字に気付いた、ごめんなさい: "維持しやすくする" - > "**それらを**維持しやすくする":p –

関連する問題