任何人都知道一个好的原则,或者可能是一个用于处理symfony2中导航菜单的包吗?
我尝试过Knp捆绑包,但它只是setter和getters。我虽然控制器将匹配我的主菜单的功能,但操作将匹配子菜单,其他参数可以映射到子子菜单。
我认为我可以使我的应用程序主菜单中的每个条目都与XController.php
相关,并且其下的子菜单中的每个条目都与同一控制器中的xAction
相关。 Knp非常灵活,但(据我所知)并不支持这样的映射。
当我们在相关的控制器中时,无论操作或任何其他参数,主导航条目都应处于活动状态。这就是问题所在。在symfony的配置中,您有_controller: ABBundle:NameController:nameAction
,从中提取控制器和操作名称非常繁重,并且不是每个页面加载运行都不是一个好主意。如果我匹配整个_controller字符串,那么我的主菜单条目将不会独立于动作...
此外我认为甚至可以通过此架构生成面包屑,第一个链接将是主导航的活动链接的副本,第二个链接可以是子导航菜单的活动条目,其余可以通过根据逻辑控制器。
有什么想法吗?
答案 0 :(得分:4)
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菜单是我的解决方案。 非常灵活,用户可以使用漂亮的界面等进行编辑。