删除 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