Очень поздно, и я думаю, вы уже нашли способ, но если кто-то все еще ищет его, я даю свой ответ.
В принципе, вы можете достичь этого с помощью метода setCurrent()
. Например, я хотел проверить его с помощью моих текущих маршрутов. Итак, что я сделал,
Добавлена request_stack
в моей службе застройщика. Так что мое обслуживание было что-то вроде
app.menu_builder:
class: MyBundle\Menu\MenuBuilder
arguments: ["@knp_menu.factory", "@security.authorization_checker", '@request_stack']
tags:
- { name: knp_menu.menu_builder, method: createSideMenu, alias: side }
Теперь конструктор части в моем MenuBuilder классе, глядя искали что-то вроде
use Knp\Menu\FactoryInterface;
use Symfony\Component\Translation\TranslatorInterface;
use Symfony\Component\HttpFoundation\RequestStack;
class MenuBuilder
{
/**
* @var FactoryInterface
*/
private $factory;
/**
* @var TranslatorInterface
*/
private $translator;
/**
* @var RequestStack
*/
private $requestStack;
/**
* MenuBuilder constructor.
* @param FactoryInterface $factory
* @param TranslatorInterface $translator
*/
public function __construct(
FactoryInterface $factory,
TranslatorInterface $translator,
RequestStack $requestStack
) {
$this->factory = $factory;
$this->translator = $translator;
$this->requestStack = $requestStack;
$this->prefix = $requestStack->getCurrentRequest()->get('_prefix');
}
}
Затем я создал свое меню, например:
$menu->addChild('level1_1', array(
'label' => "<span>Committee</span>",
'uri' => '#',
'extras' => array('safe_label' => true)
));
$menu['level1_1']->addChild('level2_1', array(
'label' => "<span>Level 2 Number 1</span>",
'route' => 'route_1',
'extras' => array('safe_label' => true)
));
$menu['level1_1']->addChild('level2_2', array(
'label' => "<span>Level 2 Number 2</span>",
'route' => 'route_2',
'extras' => array('safe_label' => true)
));
$menu->addChild('level1_2', array(
'label' => "<span>Committee</span>",
'uri' => '#',
'extras' => array('safe_label' => true)
));
$menu['level1_2']->addChild('level2_3', array(
'label' => "<span>Level 2 Number 3</span>",
'route' => 'route_3',
'extras' => array('safe_label' => true)
));
$menu['level1_2']->addChild('level2_4', array(
'label' => "<span>Level 2 Number 4</span>",
'route' => 'route_4',
'extras' => array('safe_label' => true)
));
Теперь идет основная часть. После того, как объект меню был готов для меня, я сопоставил маршруты с его родителем и установил родительский актив, прежде чем возвращать объект меню.
$request = $this->requestStack->getCurrentRequest();
$routeName = $request->get('_route');
switch ($routeName)
{
case 'route_1':
case 'route_2':
$menu['level1_1']->setCurrent(true);
break;
case 'route_3':
case 'route_4':
$menu['level1_2']->setCurrent(true);
break;
}
Вместо этого переключателя раздела, вы можете использовать свой собственный вход в соответствии с вашими потребностями. Надеюсь, это достаточно ясно, чтобы понять.