可以做到的,我曾经也确实这样做过,但是这种事情是否应该使用 KnpMenuBundle 我不太确定!无论如何,我通过将 MenuBuilder 类定义为服务并注入 @template 服务来实现这一点。这不会像您提到的那样调用控制器操作,但允许您呈现您希望的任何模板......
/**
* @param Request $request
* @return \Knp\Menu\ItemInterface
*/
protected function createUserMenuLoggedOut(Request $request)
{
$menu = $this->factory->createItem('root');
$signInItem = $menu->addChild('Sign in', array('route' => 'fos_user_security_login'));
$signInItem
->setLinkAttributes(array(
'id' => 'sign-in-link',
'class' => 'dropdown-toggle',
'data-toggle' => 'dropdown',
'data-target' => '#signin'
))
->setAttributes(array(
'id' => 'signin',
'class' => 'dropdown'
))
;
// THIS IS THE LINE YOU'RE INTERESTED IN
$signInItem->addChild($this->templating->render('ApplicationSonataUserBundle:Security:login_options.html.twig'));
// more menu items...
return $menu;
}
如果我没记错的话,我认为这最终将模板包装在一个附加文件中,<ul>...</ul>
但经过一些造型后这并没有造成太大问题。