删除 KnpMenu 上的 RouteVoter
Remove RouteVoter on a KnpMenu
外联网的每个包都是一个独立的应用程序。在我的菜单中列出了每个应用程序,我喜欢根据实际路由前缀标记当前应用程序。
首先是base.html.twig中的twig代码:
{{ knp_menu_render('AppBundle:Builder:mainMenu', { 'currentClass': 'active'}) }}
生成器函数:
public function mainMenu(FactoryInterface $factory, array $options){
$main = $factory->createItem('root');
foreach($this->getExtranetBundles() as $bundle){
$main->addChild($bundle->getAcronym(), array('route' => $bundle->getRoute()));
}
// Current Element
$matcher = new Matcher();
$matcher->addVoter(new BundleVoter($this->getCurrentBundle()));
$renderer = new ListRenderer($matcher);
$renderer->render($main);
return $main;
}
我的 BundleVoter class 工作正常,如果找到当前菜单,returns 为真。但是在 HTML 中,当前元素从不包含 "active" class.
我在 KnpMenuBundle 中阅读了更多内容,并在 Knp\Menu\Matcher class:
中添加了一些调试代码
public function addVoter(VoterInterface $voter)
{
echo "add voter: " . get_class($voter);
$this->voters[] = $voter;
}
得到这个输出:
add voter: AppBundle\Menu\BundleVoter
add voter: Knp\Menu\Matcher\Voter\RouteVoter
神秘的RouteVoter从何而来?它会覆盖我对当前元素的 BundleVoter 选择吗?我该如何停用/覆盖它?
找到了改变标准的方法 knp_menu class。我将 services.yml 文件编辑为以下内容:
parameters:
knp_menu.voter.router.class: AppBundle\Menu\BundleVoter
services:
appbundle.menu.voter.request:
class: AppBundle\Menu\BundleVoter
arguments: [@service_container]
tags:
- { name: knp_menu.voter }
class 仍然被实例化了两次,不幸的是我必须检查传递的参数是否为空。 $container 参数必须是可选的...
class BundleVoter implements VoterInterface
{
private $container;
public function __construct($container = null)
{
if($container != null)
$this->container = $container;
}
public function matchItem(ItemInterface $item)
{
if($this->container != null){
$bundle = $this->container->get('menubundles')->getCurrentBundle();
if (null === $bundle || null === $item->getName()) {
return null;
}
if ($item->getName() == $bundle->getAcronym()) {
return true;
}
}
return null;
}
}
如果您找到更好的解决方案,请写信:-) Thx
外联网的每个包都是一个独立的应用程序。在我的菜单中列出了每个应用程序,我喜欢根据实际路由前缀标记当前应用程序。
首先是base.html.twig中的twig代码:
{{ knp_menu_render('AppBundle:Builder:mainMenu', { 'currentClass': 'active'}) }}
生成器函数:
public function mainMenu(FactoryInterface $factory, array $options){
$main = $factory->createItem('root');
foreach($this->getExtranetBundles() as $bundle){
$main->addChild($bundle->getAcronym(), array('route' => $bundle->getRoute()));
}
// Current Element
$matcher = new Matcher();
$matcher->addVoter(new BundleVoter($this->getCurrentBundle()));
$renderer = new ListRenderer($matcher);
$renderer->render($main);
return $main;
}
我的 BundleVoter class 工作正常,如果找到当前菜单,returns 为真。但是在 HTML 中,当前元素从不包含 "active" class.
我在 KnpMenuBundle 中阅读了更多内容,并在 Knp\Menu\Matcher class:
中添加了一些调试代码public function addVoter(VoterInterface $voter)
{
echo "add voter: " . get_class($voter);
$this->voters[] = $voter;
}
得到这个输出:
add voter: AppBundle\Menu\BundleVoter
add voter: Knp\Menu\Matcher\Voter\RouteVoter
神秘的RouteVoter从何而来?它会覆盖我对当前元素的 BundleVoter 选择吗?我该如何停用/覆盖它?
找到了改变标准的方法 knp_menu class。我将 services.yml 文件编辑为以下内容:
parameters:
knp_menu.voter.router.class: AppBundle\Menu\BundleVoter
services:
appbundle.menu.voter.request:
class: AppBundle\Menu\BundleVoter
arguments: [@service_container]
tags:
- { name: knp_menu.voter }
class 仍然被实例化了两次,不幸的是我必须检查传递的参数是否为空。 $container 参数必须是可选的...
class BundleVoter implements VoterInterface
{
private $container;
public function __construct($container = null)
{
if($container != null)
$this->container = $container;
}
public function matchItem(ItemInterface $item)
{
if($this->container != null){
$bundle = $this->container->get('menubundles')->getCurrentBundle();
if (null === $bundle || null === $item->getName()) {
return null;
}
if ($item->getName() == $bundle->getAcronym()) {
return true;
}
}
return null;
}
}
如果您找到更好的解决方案,请写信:-) Thx