【问题标题】:Symfony 2: Autogenerated navigation menusSymfony 2:自动生成的导航菜单
【发布时间】:2012-02-16 18:15:22
【问题描述】:

任何人都知道在 symfony2 中处理导航菜单的一个很好的原则或捆绑包?

我已经尝试过 Knp 捆绑包,但它只是 setter 和 getter。我认为控制器将匹配我的主菜单的功能,操作将匹配子菜单,并且其他参数可以映射到子菜单。

我认为我可以让我的应用程序使我的主菜单中的每个条目都与 XController.php 相关,并且它下面的子菜单中的每个条目都将与同一控制器中的 xAction 相关。 Knp 相当灵活,但(据我所知)不支持这种映射。

无论操作或任何其他参数如何,当我们在相关控制器中时,主导航条目都应该是活动的。这就是问题所在。在 symfony 的配置中,您有 _controller: ABBundle:NameController:nameAction,从中提取控制器和操作名称非常繁重,并且在每个页面加载时都运行不是一个好主意。如果我匹配整个 _controller 字符串,那么我的主菜单条目将不会独立于操作而处于活动状态..

我还认为这种模式甚至可以生成面包屑,第一个链接将是主导航中活动链接的副本,第二个可能是子导航菜单的活动条目,其余的可以通过设置控制器根据逻辑。

有什么想法吗?

【问题讨论】:

  • 不能真正帮助您解决主要问题,但我会说所有配置内容最终都被编译成相当有效的 php 代码。检查缓存下的文件以查看结果。所以不要担心大多数东西太重。
  • 是的,我决定自己编写导航服务。我认为使用缓存真的会加快速度:)
  • 是否可以查看该代码?我刚刚遇到了同样的问题来解决根据当前路由参数生成的菜单。

标签: php navigation symfony


【解决方案1】:

我是这样做的。 我已将 KnpMenu 注册为服务并将 entityManager 传递给该类。

stex_site_main.menu_builder:
    class: Stex\SiteBundle\Menu\MenuBuilder
    arguments: ["@knp_menu.factory", "@doctrine.orm.entity_manager"]

stex_site_main.menu.main:
    class: Knp\Menu\MenuItem
    factory_service: stex_site_main.menu_builder
    factory_method: createMainMenu
    arguments: ["@request"]
    scope: request
    tags:
        - { name: knp_menu.menu, alias: main }

使用 EM,我打开实体 MyMenu 并生成写入数据库的菜单条目。

private $factory;
private $em;
public function __construct(FactoryInterface $factory, \Doctrine\ORM\EntityManager $em)
{
    $this->factory = $factory;
    $this->em = $em;
}
public function createMainMenu(\Symfony\Component\HttpFoundation\Request $request)
{
    $menu = $this->factory->createItem('root');
    $menu->setChildrenAttribute('class', 'menu');
    $menu->addChild(' ', array('route' => 'stex_site_home_home', 'attributes' => array('class' => 'home')));
    $menu->setCurrentUri($request->getRequestUri());
    $em = $this->em;
    $q = $em->createQuery('
        SELECT m
        FROM StexAdminBundle:MyMenu m
        WHERE m.status=1
        ORDER BY menu.position');
    $r = $q->getResult();
    foreach($r as $menu) {
        $menu->addChild($menu->getName(), array('route' => $menu->getRoute(), 'routeParameters' => array(json_decode($menu->getParams())));
    }
    return $menu;
}

将控制器映射到菜单条目(和 sub sub sub 等)在现实世界的应用程序中是非常罕见的情况(据我说)并且不会很有用(认为您将不得不编写大多数“异常”哪个控制器不包括等)。

拥有 DB 菜单是我的解决方案。 非常灵活,用户可以通过漂亮的界面等进行编辑。

【讨论】:

  • 如果有子元素怎么办?
猜你喜欢
  • 2021-11-08
  • 1970-01-01
  • 2015-06-09
  • 2012-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多