KnpMenuBundle and dynamic route parameter

I use knpmenubundle for my site, and here is my problem: I have a list of users listed along this route: / admin / users and the menu looks like this:

User (is opened) list (is active) add new 

in the list view, the list element in the menu is active, as I want in adding a new view, the add new element in the menu is active, as I want

but when I want to edit a user that still exists, I cannot activate the Users element because the route has a dynamic parameter

this is how my site is structured:

in src / dn / AdminBundle / Resources / Config / routing.yml

 # Users ### List dnAdmin_usersList: pattern: /users/{page} defaults: { _controller: dnAdminBundle:User:list, page: 1 } requirements: page: \d* ### Edit dnAdmin_userEdit: pattern: /user/edit/{id} defaults: { _controller: dnAdminBundle:User:edit} requirements: id: \d+ 

in application / ressources / view / layout / html / twig

 {{ render(controller("dnAdminBundle:Common:leftMenu")) }} 

in src / dn / AdminBundle / Controller / CommonController

 public function leftMenuAction() { return $this->render('dnAdminBundle:Common:leftMenu.html.twig'); } 

in src / dn / AdminBundle / Resources / view / Common / leftMenu / html.twig

 {{ knp_menu_render('leftMenu', {'template':'dnAdminBundle:Menu:knp_menu.html.twig', 'currentClass':'active', 'ancestorClass':'active'}) }} 

in src / dn / AdminBundle / Resources / config / services.yml

 services: dn_admin.menu_builder: class: dn\AdminBundle\Menu\MenuBuilder arguments: ["@knp_menu.factory"] dn_admin.menu.leftMenu: class: Knp\Menu\MenuItem factory_service: dn_admin.menu_builder factory_method: createLeftMenu arguments: ["@request"] scope: request tags: - { name: knp_menu.menu, alias: leftMenu } 

in src / dn / AdminBundle / Menu / MenuBuilder.php namespace dn \ AdminBundle \ Menu;

use Knp \ Menu \ FactoryInterface; use Symfony \ Component \ HttpFoundation \ Request; class MenuBuilder {private $ factory;

 /** * @param FactoryInterface $factory */ public function __construct(FactoryInterface $factory) { $this->factory = $factory; } public function createLeftMenu(Request $request) { // root $menu = $this->factory->createItem('root'); $menu->setChildrenAttributes(array('class' => 'sidebar-menu')); // Users $l = $menu->addChild('Users', array( 'uri' => '#', )); $l->setAttribute('class', 'treeview'); $l->setChildrenAttribute('class', 'treeview-menu'); $l->addChild('Liste', array( 'route' => 'dnAdmin_userList', )); $l->addChild('Edit', array( 'route' => 'dnAdmin_userEdit', 'routeParameters' => $request->get('id'), )) ->setDisplay(false); } 

but $ request-> get ('id') returns an empty string

Does anyone have an idea on how I can get the current parameter in knpmenubundle?

thanks

+6
source share
2 answers

If your menu designer extends ContainerAware, you must have access to the request object. Example:

 class Builder extends ContainerAware { public function mainMenu(FactoryInterface $factory, array $options) { $request = $this->container->get('request'); $menu = $factory->createItem('root'); $parent = $menu->addChild('Users', array('route' => 'users')); $parent->addChild('Edit', array('route' => 'user_edit', 'routeParameters' => array('id' => $request->get('id')))); return $menu; } 

The menu item "Users" should receive the class current_ancestor

+10
source

If your menu builder class does not extend ContainerAware (and does not need to do this as a service), you can go to @request_stack or typehinting Symfony\Component\HttpFoundation\RequestStack and get the identifier from there

 $id - $this->requestStack->getCurrentRequest()->get('id'); // -or- $request = $this->requestStack->getCurrentRequest(); $id = $request->get('id'); 
+1
source

Source: https://habr.com/ru/post/971506/


All Articles