KnpMenu
管理员集成了 KnpMenu。它将菜单与 KnpMenu 库集成。此菜单可以是 SonataAdmin 服务,使用 Knp 菜单提供器创建的菜单,或自定义控制器的路由。
在菜单中添加自定义控制器条目
在管理菜单中添加自定义控制器条目
创建您的控制器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
use Symfony\Component\HttpFoundation\Response;
final class BlogController
{
/**
* @Route("/blog", name="blog_home")
*/
public function blogAction(): Response
{
// ...
}
/**
* @Route("/blog/article/{articleId}", name="blog_article")
*/
public function ArticleAction(string $articleId): Response
{
// ...
}
}
将控制器路由添加为菜单项
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
# config/packages/sonata_admin.yaml
sonata_admin:
dashboard:
groups:
news:
label: ~
translation_domain: ~
items:
- sonata.news.admin.post
- route: blog_home
label: Blog
- route: blog_article
route_params: { articleId: 3 }
label: Article
如果您想向具有不同角色的用户显示您的路由,您可以为每个路由配置此项。如果未设置,将检查组角色。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
# config/packages/sonata_admin.yaml
sonata_admin:
dashboard:
groups:
news:
label: ~
translation_domain: ~
items:
- sonata.news.admin.post
- route: blog_home
label: Blog
roles: ['ROLE_FOO', 'ROLE_BAR']
- route: blog_article
route_params: { articleId: 3 }
label: Article
roles: ['ROLE_ADMIN', 'ROLE_SONATA_ADMIN']
您还可以覆盖 sonata 使用的 knp_menu 模板。默认模板为 `@SonataAdmin/Menu/sonata_menu.html.twig`
1 2 3 4 5
# config/packages/sonata_admin.yaml
sonata_admin:
templates:
knp_menu_template: '@ApplicationAdmin/Menu/custom_knp_menu.html.twig'
现在您有一个菜单组,其中包含指向 sonata 管理员(通过其 ID)、您的博客和特定文章的链接。
使用菜单提供器
如上所示,声明菜单的主要方法是在您的 sonata 管理员配置文件中声明项目。在某些情况下,您可能需要根据您的业务逻辑创建更复杂的菜单。这可以通过使用菜单提供器来填充整个菜单组来实现。这是通过 provider
配置值完成的。
以下配置使用菜单提供器来填充菜单组 my_group
1 2 3 4 5 6 7 8
# config/packages/sonata_admin.yaml
sonata_admin:
dashboard:
groups:
my_group:
provider: 'MyBundle:MyMenuProvider:getMyMenu'
icon: 'fas fa-edit' # html is also supported
使用 KnpMenuBundle,您可以通过使用构建器类或将其声明为服务来创建自定义菜单。请参阅 Knp 文档 以获取更多信息。
在 sonata 中,无论您选择哪种实现,您只需将菜单别名提供给 provider 配置键即可
- 如果您使用构建器类,您的菜单别名应类似于
MyBundle:MyMenuProvider:getMyMenu
。 - 如果您使用服务,您的菜单别名是在
knp_menu.menu
标签中设置的别名。在以下示例中,它是my_menu_alias
1 2 3
<service id="my_menu_provider" class="MyBundle/MyDirectory/MyMenuProvider">
<tag name="knp_menu.menu" alias="my_menu_alias"/>
</service>
请注意,当使用 provider 选项时,您无法通过配置设置菜单标签。它在您的自定义菜单中完成。
扩展菜单
您可以通过事件修改菜单。您可以为名为 sonata.admin.event.configure.menu.sidebar
的事件注册任意数量的监听器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
// src/EventListener/MenuBuilderListener.php
namespace App\EventListener;
use Sonata\AdminBundle\Event\ConfigureMenuEvent;
final class MenuBuilderListener
{
public function addMenuItems(ConfigureMenuEvent $event): void
{
$menu = $event->getMenu();
$child = $menu->addChild('reports', [
'label' => 'Daily and monthly reports',
'route' => 'app_reports_index',
])->setExtras([
'icon' => 'fas fa-bar-chart', // html is also supported
]);
}
}
1 2 3 4 5 6 7
# config/services.yaml
services:
app.menu_listener:
class: App\EventListener\MenuBuilderListener
tags:
- { name: kernel.event_listener, event: sonata.admin.event.configure.menu.sidebar, method: addMenuItems }
请参阅 使用事件来允许扩展菜单 以获取更多信息。
隐藏菜单项
您可以修改菜单以隐藏某些菜单项。您需要在您的管理员服务中添加 show_in_dashboard
选项,或从 sonata_admin
仪表板组配置中删除菜单项
1 2 3 4 5 6
# config/services.yaml
sonata_admin.admin.post:
class: Sonata\AdminBundle\Admin\PostAdmin
tags:
- { name: sonata.admin, model_class: Sonata\AdminBundle\Entity\Post, controller: Sonata\AdminBundle\Controller\CRUDController, manager_type: orm, group: admin, label: Post, show_in_dashboard: false }
1 2 3 4 5 6 7 8 9 10 11 12 13 14
# config/packages/sonata_admin.yaml
sonata_admin:
dashboard:
groups:
news:
label: ~
translation_domain: ~
items:
# comment or remove the sonata.news.admin.post declaration to hide it from the menu.
# - sonata.news.admin.post
- route: blog_home
label: Blog
- sonata.news.admin.news
保持菜单组打开
您可以将 keep_open
选项添加到菜单组,以使该组始终保持打开状态并忽略打开/关闭效果
1 2 3 4 5 6 7 8 9 10 11 12 13
# config/packages/sonata_admin.yaml
sonata_admin:
dashboard:
groups:
sonata.admin.group.content:
keep_open: true
label: sonata_media
translation_domain: SonataMediaBundle
icon: 'fas fa-image' # html is also supported
items:
- sonata.media.admin.media
- sonata.media.admin.gallery

显示不带树状视图的菜单项
您可以修改菜单以显示不带树状视图的菜单项。您需要在您的管理员服务或 sonata_admin 仪表板组配置中添加 on_top
选项
1 2 3 4 5 6
# config/services.yaml
sonata_admin.admin.post:
class: Sonata\AdminBundle\Admin\PostAdmin
tags:
- { name: sonata.admin, model_class: Sonata\AdminBundle\Entity\Post, controller: Sonata\AdminBundle\Controller\CRUDController, manager_type: orm, group: admin, label: Post, on_top: true }
1 2 3 4 5 6 7 8 9 10 11
# config/packages/sonata_admin.yaml
sonata_admin:
dashboard:
groups:
news:
on_top: true
label: ~
translation_domain: ~
items:
- sonata.news.admin.post

在此屏幕截图中,我们向 Tag
和 Blog Post
管理员服务添加了 on_top
选项。
您不能同时为两个或多个项目使用此选项
1 2 3 4 5 6 7 8 9 10 11 12 13
# config/packages/sonata_admin.yaml
sonata_admin:
dashboard:
groups:
news:
on_top: true
label: ~
translation_domain: ~
items:
- sonata.news.admin.post
- route: blog_home
label: Blog
在这种情况下,您会收到异常:“您不能对多个同名组使用 on_top
选项”。