2016-11-21 42 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 –