kalamu/menu-service-bundle

提供通过配置来生成knp菜单的服务

v2.0.0 2018-06-12 10:15 UTC

This package is auto-updated.

Last update: 2024-09-14 17:16:19 UTC


README

此包为knp/menu-bundle提供可由配置文件配置的菜单服务。

安装

composer require kalamu/menu-service-bundle:^2.0

AppKernel.php中添加以下内容

    public function registerBundles()
    {
        $bundles = array(
            ...
            new Knp\Bundle\MenuBundle\KnpMenuBundle(),
            new Kalamu\MenuServiceBundle\KalamuMenuServiceBundle(),
        );
    }

如何构建菜单

要构建菜单,您只需在您的app/config/config.yml文件中添加项目

kalamu_menu_service:
    menu_name:
        items:
            - {label: "Home", route: home_route, icon: '<i class="fa fa-home"></i>' }
            - {label: "Item 1", route: item1_route, icon: '<i class="fa fa-gear"></i>' }
            ...

然后,在模板中添加菜单

<div class="my_menu">
    {{knp_menu_render('menu_name', {'allow_safe_labels': true})}}
</div>

安全性

通过角色限制访问

roles选项允许根据用户的授权控制项目是否可用。此选项接受一个角色数组。用户必须被授权访问这些角色中的每一个才能查看项目。

示例

kalamu_menu_service:
    menu_name:
        items:
            - {label: "Home", route: home_route, icon: '<i class="fa fa-home"></i>', roles: ['ROLE_USER', 'ROLE_OPEN_DOOR'] }

要访问home项目,用户必须同时拥有ROLE_USERROLE_OPEN_DOOR角色。

通过表达式限制访问

'allow_if'选项提供了一种更灵活的方式来处理限制。此选项接受一个表达式作为参数。有关语法信息,请参阅有关如何在安全中使用表达式的文档。

示例

kalamu_menu_service:
    menu_name:
        items:
            - {label: "Home", route: home_route, icon: '<i class="fa fa-home"></i>', allow_if: "has_role('ROLE_USER') or has_role('ROLE_OPEN_DOOR')" }

要访问首页项目,用户必须拥有ROLE_USERROLE_OPEN_DOOR角色之一。

可以使用roles选项与allow_if选项结合使用。在这种情况下,必须满足这两个约束才能授予权限。

通过层次结构限制访问

在具有层次结构项的菜单中,通常父项目在没有其子项的情况下没有意义。因此,如果所有子项对当前用户不可访问,则必须将其删除。

如果存在少数基础角色,可以使用allow_if选项来处理此问题。但是,如果约束的数量增加,任务将变得毫无必要地繁琐。

hide_if_no_child选项解决了这个问题。如果设置为true,则项目仅在用户至少可以访问一个子项时才可用。

示例

kalamu_menu_service:
    menu_name:
        items:
            -
                label: "User management"
                route: ''
                hide_if_no_child: true
                items:
                    - {label: "Users", route: user_list, roles: ['ROLE_MANAGE_USER'] }
                    - {label: "Groups", route: group_list, allow_if: '(user and user.isSuperAdmin())) or user.isGoodManager()' }

自定义

如果您想交互式地更改菜单,可以使用事件kalamu.menu_service.configure.{menu_name}。有关knp/menu-bundle的更多信息,请参阅https://github.com/KnpLabs/KnpMenuBundle/blob/master/Resources/doc/events.md#create-a-listener