Symfony 2:自动生成的导航菜单

时间:2012-02-16 18:15:23

标签: php navigation symfony

任何人都知道一个好的原则,或者可能是一个用于处理symfony2中导航菜单的包吗?

我尝试过Knp捆绑包,但它只是setter和getters。我虽然控制器将匹配我的主菜单的功能,但操作将匹配子菜单,其他参数可以映射到子子菜单。

我认为我可以使我的应用程序主菜单中的每个条目都与XController.php相关,并且其下的子菜单中的每个条目都与同一控制器中的xAction相关。 Knp非常灵活,但(据我所知)并不支持这样的映射。

当我们在相关的控制器中时,无论操作或任何其他参数,主导航条目都应处于活动状态。这就是问题所在。在symfony的配置中,您有_controller: ABBundle:NameController:nameAction,从中提取控制器和操作名称非常繁重,并且不是每个页面加载运行都不是一个好主意。如果我匹配整个_controller字符串,那么我的主菜单条目将不会独立于动作...

此外我认为甚至可以通过此架构生成面包屑,第一个链接将是主导航的活动链接的副本,第二个链接可以是子导航菜单的活动条目,其余可以通过根据逻辑控制器。

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

我是这样做的。 我已将KnpMenu注册为服务并将entityManager传递给该类。

stex_site_main.menu_builder:
    class: Stex\SiteBundle\Menu\MenuBuilder
    arguments: ["@knp_menu.factory", "@doctrine.orm.entity_manager"]

stex_site_main.menu.main:
    class: Knp\Menu\MenuItem
    factory_service: stex_site_main.menu_builder
    factory_method: createMainMenu
    arguments: ["@request"]
    scope: request
    tags:
        - { name: knp_menu.menu, alias: main }

手持EM我打开一个Entity MyMenu并生成用db编写的菜单条目。

private $factory;
private $em;
public function __construct(FactoryInterface $factory, \Doctrine\ORM\EntityManager $em)
{
    $this->factory = $factory;
    $this->em = $em;
}
public function createMainMenu(\Symfony\Component\HttpFoundation\Request $request)
{
    $menu = $this->factory->createItem('root');
    $menu->setChildrenAttribute('class', 'menu');
    $menu->addChild(' ', array('route' => 'stex_site_home_home', 'attributes' => array('class' => 'home')));
    $menu->setCurrentUri($request->getRequestUri());
    $em = $this->em;
    $q = $em->createQuery('
        SELECT m
        FROM StexAdminBundle:MyMenu m
        WHERE m.status=1
        ORDER BY menu.position');
    $r = $q->getResult();
    foreach($r as $menu) {
        $menu->addChild($menu->getName(), array('route' => $menu->getRoute(), 'routeParameters' => array(json_decode($menu->getParams())));
    }
    return $menu;
}

将控制器映射到菜单条目(和子子子等)在现实世界的应用程序(根据我)中是非常罕见的情况并且不会非常有用(认为你将不得不编码大多数'例外'哪个控制器不能包括等。)。

拥有DB菜单是我的解决方案。 非常灵活,用户可以使用漂亮的界面等进行编辑。