我這樣做了。 我已經將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並生成寫入數據庫的菜單條目。
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;
}
映射控制器的菜單項(和子子子等)是(根據我)在現實世界中的應用非常罕見的情況下,也不會是非常有用的(認爲你將不得不代碼大多是「例外」哪個控制器不包括,等等)。
擁有數據庫菜單是我的解決方案。 非常靈活,用戶可以用漂亮的界面等進行編輯。
不能真正幫助你解決主要問題,但我會說所有配置的東西都會被編譯成相當有效的PHP代碼。檢查緩存下的文件以查看結果。所以不要擔心大多數東西太重。 – Cerad 2012-02-17 03:54:32
是的,我決定去編寫我自己的導航服務。我認爲使用緩存將真的加快速度:) – 2012-02-17 17:37:45
是否有可能看看該代碼?我剛剛遇到同樣的問題,以解決取決於當前路線參數生成的菜單。 – nysander 2012-05-12 19:19:56