エクストラネットの各バンドルは、独立したアプリケーションです。私のメニューにはすべてのアプリがリストされており、実際のルートプレフィックスに応じて現在のアプリをマークするのが好きです.
最初に 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 クラスは正しく動作し、現在のメニューが見つかった場合は true を返します。しかし、HTML では、現在の要素に「アクティブな」クラスが含まれることはありません。
KnpMenuBundle をもう少し読み、Knp\Menu\Matcher クラスにデバッグ コードを追加しました。
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 選択を上書きしますか? どうすれば非アクティブ化/上書きできますか?