首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >KnpMenuBundle与动态路由参数

KnpMenuBundle与动态路由参数
EN

Stack Overflow用户
提问于 2014-06-29 18:30:46
回答 1查看 11.8K关注 0票数 8

我在我的网站上使用了knpmenubundle,这是我的问题:我有一个用户列表,列出了这个路径:/admin/ user,菜单是这样的:

代码语言:javascript
复制
User (is opened)
    list (is active)
    add new

在列表视图中,菜单中的项目" list “是活动的,就像我在添加新视图中想要的那样,菜单中的项目"add new”是活动的,就像我想要的那样。

但是,当我想编辑一个已经存在的用户时,我无法激活项目“ user ”,因为te路由有一个动态参数

以下是我的网站的结构:

src/dn/AdminBundle/Resources/Config/routing.yml中的

代码语言:javascript
复制
# 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+

app/ressources/view/layout/html/twig中的

代码语言:javascript
复制
{{ render(controller("dnAdminBundle:Common:leftMenu")) }}

src/dn/AdminBundle/Controller/CommonController中的

代码语言:javascript
复制
public function leftMenuAction()
{
    return $this->render('dnAdminBundle:Common:leftMenu.html.twig');
}

src/dn/AdminBundle/Resources/view/Common/leftMenu/html.twig中的

代码语言:javascript
复制
{{ knp_menu_render('leftMenu', {'template':'dnAdminBundle:Menu:knp_menu.html.twig', 'currentClass':'active', 'ancestorClass':'active'}) }}

src/dn/AdminBundle/Resources/config/services.yml中的

代码语言:javascript
复制
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 }

src/dn/AdminBundle/Menu/MenuBuilder.php名称空间dn\AdminBundle中的

使用Knp\Menu\FactoryInterface;使用Symfony\Component\HttpFoundation\Request;类MenuBuilder {私有$factory;

代码语言:javascript
复制
/**
 * @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);
}

但是$request->get('id')返回空字符串

有人知道我怎样才能得到现在的参数吗?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2014-09-24 02:11:11

如果您的菜单构建器扩展了ContainerAware,您应该能够访问请求对象。示例:

代码语言:javascript
复制
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;
}

用户菜单项应获得current_ancestor类。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24478971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档