跳到内容

使用 KnpMenuBundle

编辑此页

欢迎来到 KnpMenuBundle - 创建菜单再次变得有趣!

安装

步骤 1:下载 Bundle

打开命令行控制台,进入你的项目目录并执行以下命令来下载此 bundle 的最新稳定版本

1
composer require knplabs/knp-menu-bundle

此命令需要你全局安装 Composer,如 Composer 文档的安装章节中所述。

步骤 2:启用 Bundle

感谢 Flex,KnpMenuBundle 应该会自动启用和配置。

如果你不使用 Flex,你可以手动启用它,通过在你的项目的 Kernel 中添加以下行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// e.g. app/AppKernel.php

// ...
class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = [
            // ...

            new Knp\Bundle\MenuBundle\KnpMenuBundle(),
        ];

        // ...
    }

    // ...
}

步骤 3:(可选) 配置 bundle

该 bundle 附带合理的默认配置,如下所示。 如果你需要更改这些选项,可以定义它们

1
2
3
4
5
6
7
8
9
10
# config/packages/knp_menu.yaml
knp_menu:
    # use "twig: false" to disable the Twig extension and the TwigRenderer
    twig:
        template: KnpMenuBundle::menu.html.twig
    # if true, enables the helper for PHP templates
    # support for templating is deprecated, it will be removed in next major version
    templating: false
    # the renderer to use, list is also available by default
    default_renderer: twig

注意

如果你禁用了 Twig 支持,请注意更改默认渲染器。

创建你的第一个菜单!

有两种创建菜单的方法:“简单”方式,以及将菜单创建为服务的更灵活的方法。

方法 a) 简单的方式 (耶!)!

要创建菜单,首先在你的 bundle 之一的 Menu 目录中创建一个新类。 这个类 - 在我们的示例中称为 Builder - 将为你需要构建的每个菜单提供一个方法。

一个示例构建器类可能如下所示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// src/Menu/Builder.php
namespace App\Menu;

use App\Entity\Blog;
use Knp\Menu\FactoryInterface;
use Knp\Menu\ItemInterface;

final class Builder
{
    public function __construct(
        private EntityManagerInterface $em,
    ) {
    }

    public function mainMenu(FactoryInterface $factory, array $options): ItemInterface
    {
        $menu = $factory->createItem('root');

        $menu->addChild('Home', ['route' => 'homepage']);

        // findMostRecent and Blog are just imaginary examples
        $blog = $this->em->getRepository(Blog::class)->findMostRecent();

        $menu->addChild('Latest Blog Post', [
            'route' => 'blog_show',
            'routeParameters' => ['id' => $blog->getId()]
        ]);

        // create another menu item
        $menu->addChild('About Me', ['route' => 'about']);
        // you can also add sub levels to your menus as follows
        $menu['About Me']->addChild('Edit profile', ['route' => 'edit_profile']);

        // ... add more children

        return $menu;
    }
}

使用标准的 knp_menu.html.twig 模板和你的当前页面为 “Home”,你的菜单将使用以下标记渲染

1
2
3
4
5
6
7
8
9
10
11
12
13
<ul>
    <li class="current first">
        <a href="#route_to/homepage">Home</a>
    </li>
    <li class="current_ancestor">
        <a href="#route_to/page_show/?id=42">About Me</a>
        <ul class="menu_level_1">
            <li class="current first last">
                <a href="#route_to/edit_profile">Edit profile</a>
            </li>
        </ul>
    </li>
</ul>

注意

可以使用 bundle 继承覆盖菜单构建器。

要实际渲染菜单,只需从任何模板中的任何位置执行以下操作

1
{{ knp_menu_render('App:Builder:mainMenu') }}

使用此方法,你可以使用三部分字符串引用菜单:bundle:class:method

如果你需要创建第二个菜单,你只需向 Builder 类添加另一个方法(例如 sidebarMenu),构建并返回新菜单,然后通过 App:Builder:sidebarMenu 渲染它。

就是这样!菜单是非常可配置的。 有关更多详细信息,请参阅 KnpMenu 文档

方法 b) 将菜单构建器作为服务

有关如何将菜单构建器注册为服务的信息,请阅读 将菜单构建器创建为服务

方法 c) 将菜单作为服务

有关如何注册服务并将其标记为菜单的信息,请阅读 将菜单创建为服务

注意

为了提高性能,你可以禁用你不需要的提供程序

渲染菜单

一旦你设置了菜单,渲染它就很容易了。 如果你使用了“简单”的方式,那么请执行以下操作

1
{{ knp_menu_render('App:Builder:mainMenu') }}

此外,你可以将一些选项传递给渲染器

1
{{ knp_menu_render('App:Builder:mainMenu', {'depth': 2, 'currentAsLink': false}) }}

有关选项的完整列表,请参阅 KnpMenu 文档上的“其他渲染选项”标题。

你还可以“获取”菜单,你可以使用它稍后渲染

1
2
{% set menuItem = knp_menu_get('App:Builder:mainMenu') %}
{{ knp_menu_render(menuItem) }}

如果你只想检索菜单的某个分支,你可以执行以下操作,其中 “Contact” 是根菜单项之一,并且在其下方有子项。

1
2
{% set menuItem = knp_menu_get('App:Builder:mainMenu', ['Contact']) %}
{{ knp_menu_render(['App:Builder:mainMenu', 'Contact']) }}

如果你想将一些选项传递给构建器,你可以使用 knp_menu_get 函数的第三个参数

1
2
{% set menuItem = knp_menu_get('App:Builder:mainMenu', [], {'some_option': 'my_value'}) %}
{{ knp_menu_render(menuItem) }}
这项工作,包括代码示例,是在 Creative Commons BY-SA 3.0 许可下获得许可的。
目录
    版本