使用 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) 将菜单构建器作为服务
有关如何将菜单构建器注册为服务的信息,请阅读 将菜单构建器创建为服务。
渲染菜单
一旦你设置了菜单,渲染它就很容易了。 如果你使用了“简单”的方式,那么请执行以下操作
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) }}