zerkalica/millwright-menu-bundle

此软件包最新版本(v1.0.2)没有可用的许可证信息。

为 knp menu bundle 提供配置抽象

v1.0.2 2018-06-06 11:58 UTC

This package is not auto-updated.

Last update: 2024-09-22 07:21:19 UTC


README

MillwrightMenuBundle 扩展了 KnpMenuBundle 的基本功能,并添加了配置、路由、翻译和安全上下文支持。网站上每个链接都是配置菜单容器的组成部分,支持翻译、基于角色的和基于 acl 的安全以及路由参数。

基本文档

功能

  1. 它使用 JMSSecurityExtraBundle 注解来配置菜单项的可见性:基于角色和基于 acl 的安全上下文支持

  2. 菜单选项由两部分组成

  • items 描述每个菜单项:标签、路由|uri、翻译、角色
  • tree 描述每个菜单容器作为菜单项的层次结构
  1. items 可以从配置文件以及控制器类和操作中的注解进行配置

  2. 我们可以在容器中任意调整配置的菜单项

  3. 菜单 twig 辅助函数支持路由参数,可以根据 acl 需求动态更改菜单项的可见性

  4. 菜单选项从多个来源合并:配置文件中的 tree 部分、item 部分、操作方法中的 @Menu 注解、控制器类中的 @Menu 注解

安装

步骤 1) Composer

通过 composer 需求此软件包

composer require zerkalica/millwright-menu-bundle dev-master

步骤 2) 注册软件包

要开始使用此软件包,请在 Kernel 中注册它

<?php
// app/AppKernel.php

public function registerBundles()
{
    $bundles = array(
        // ...
        new Knp\Bundle\MenuBundle\KnpMenuBundle(),
        new Millwright\MenuBundle\MillwrightMenuBundle(),
        new Millwright\ConfigurationBundle\MillwrightConfigurationBundle(),
    );
    // ...
)

步骤 3) 配置 knp 软件包

# app/config/config.yml
imports:
    - { resource: menu.yml }
...
knp_menu:
    twig:  # use "twig: false" to disable the Twig extension and the TwigRenderer
        template: MillwrightMenuBundle:Default:knp_menu.html.twig

    templating: false # if true, enables the helper for PHP templates
    default_renderer: twig # The renderer to use, list is also available by default

创建菜单

任何软件包都可以通过 millwright_menu.menu_options 标记的服务提供自己的菜单或修改现有菜单

        <service id="millwright_menu.options" class="%millwright_configuration.options.class%">
            <tag name="millwright_menu.menu_options" order="100"/>
            <argument type="collection">
                <argument key="items">%millwright_menu.items%</argument>
                <argument key="tree">%millwright_menu.tree%</argument>
                <argument key="renderers">%millwright_menu.renderers%</argument>
            </argument>
        </service>

order 属性 - 提供的菜单的顺序。第一个参数是菜单选项的集合。默认情况下,提供了一个由 MillwrightMenuBundle 提供,并在应用程序配置的 millwright_menu 部分中配置的菜单。

# app/config/menu.yml

millwright_menu:
    renderers:
        navigation: #menu type id
            renderer: null # custom renderer
            rendererOptions:
                template: MillwrightMenuBundle:Default:knp_menu.html.twig

    items: #menu items
        homepage: #menu name, used for route name, if it not set in options
            translateDomain: 'MillwrightMenuBundle'
            roles: IS_AUTHENTICATED_ANONYMOUSLY

        fos_user_registration_register:
            translateDomain: 'MillwrightMenuBundle'
            roles: ROLE_USER

        fos_user_profile_show:
            translateDomain: 'MillwrightMenuBundle'
            showNonAuthorized: true #show link in menu for non-authorized user
            roles: ROLE_USER

        fos_user_change_password:
            translateDomain: 'FOSUserBundle'
            roles: ROLE_USER
            label: 'change_password.submit'
        test:
            translateDomain: 'FOSUserBundle'
            label: 'change_password.submit'
            uri: 'http://www.google.com'

    tree: #menu containers
        user_admin: #user administration links container
            type: navigation # menu type id
            children:
                fos_user_profile_show: ~
                fos_user_change_password: ~

        main: #main container
            type: navigation # menu type id
            children:
                homepage: ~
                test: ~
                fos_user_registration_register: ~
                fos_user_profile_show:
                    children:
                        fos_user_change_password: ~

使用注解

可以配置注解中的项目部分

# src/Application/Millwright/CoreBundle/Controller/DefaultController.php
...
/**
 * @Menu(translateDomain="MillwrightMenuBundle")
 */
class DefaultController extends Controller {
    /**
     * @Route("/user/{user}", name="showUser")
     * @Template()
     * @Secure(roles="ROLE_ADMIN")
     * @SecureParam(name="user", permissions="EDIT")
     * @Menu(showNonAuthorized=true, label="User edit")
     */
    public function userAction(User $user) {
        return array('content' => 'hello');
    }
}

在模板中使用菜单

millwright_menu_render 支持额外的路由参数,其他选项与 knp_menu_render 相同。

{{ millwright_menu_render('main', routeParams, options, renderer) }}

简单用法

{{ millwright_menu_render('main') }}

高级

我们有一个用户集合,每个用户都有 acl 权限

{% for user in users %}
    {{ millwright_menu_render('main', {user: user.id}) }}
{% endfor %}

菜单项选项

# app/config/menu.yml

millwright_menu:
    renderers:
        <menu type>:
            renderer: null # custom renderer
            rendererOptions:
                ...
    items:
        <key>:
            <item options>
    ...
    tree:
        <menu_name>:
            type: <menu type>
            children:
                <items hierarchy>

项目部分

  • <key> - 用作名称、路由和标签的默认值
  • uri - 如果未设置路由参数的 uri 字符串
  • label - 标签文本或翻译字符串模板
  • name - 菜单项名称,用作路由的默认值
  • attributes - knp 菜单项选项
  • linkAttributes- knp 菜单项选项
  • childrenAttributes- knp 菜单项选项
  • labelAttributes- knp 菜单项选项
  • display- knp 菜单项选项
  • displayChildren- knp 菜单项选项
  • translateDomain - 翻译域
  • translateParameters - 翻译参数
  • secureParams - 复制 @SecureParam JMSSecurityExtraBundle 注解
  • roles - 复制 @Secure JMSSecurityExtraBundle 注解
  • route - 生成 uri 的路由名称,如果未设置且未设置 uri,则从键中加载
  • routeAbsolute - 生成绝对 url
  • showNonAuthorized - 对非授权用户显示
  • showAsText - 如果授权且无法访问项目,则将项目以文本形式显示
  • icon - 菜单项的图标类

tree 部分

  • type - 菜单容器类型
  • children - 子菜单项

renderers 部分

  • <menu type> - 菜单容器类型
  • renderer - 自定义渲染器
  • rendererOptions - 传递给菜单渲染器的选项:模板等

注解选项

@Menu 注解支持:标签、翻译域、翻译参数、名称、显示非授权、显示为文本选项。

示例

//@todo 沙盒

# src/Application/Millwright/CoreBundle/Controller/ArticleController.php
...
/**
 * @Menu(translateDomain="MillwrightMenuBundle")
 */
class ArticleController extends Controller
{
    /**
     * @Route("/articles", name="article_index")
     * @Template()
     * @Secure(roles="ROLE_USER")
     */
    public function indexAction() {
        //
    }

    /**
     * @Route("/article/create", name="article_create")
     * @Template()
     * @Secure(roles="ROLE_USER")
     * @SecureParam(name="article", permissions="EDIT")
     */
    public function createAction() {
        //
    }

    /**
     * @Route("/article/{article}", name="article_view")
     * @Secure(roles="ROLE_USER")
     * @SecureParam(name="article", permissions="VIEW")
     * @Template()
     */
    public function viewAction(Article $article) {
        return array('article' => $article);
    }

    /**
     * @Route("/article/{article}/edit", name="article_edit")
     * @Template()
     * @Secure(roles="ROLE_USER")
     * @SecureParam(name="article", permissions="EDIT")
     */
    public function editAction(Article $article) {
        //
    }

    /**
     * @Route("/article/{article}/delete", name="article_delete")
     * @Template()
     * @Secure(roles="ROLE_USER")
     * @SecureParam(name="article", permissions="DELETE")
     */
    public function deleteAction(Article $article) {
        //
    }
}

菜单文件

# app/config/menu.yml

millwright_menu:
    tree:
        article_index_actions:
            type: menu
            children:
                article_create: ~

        article_actions:
            type: actions
            children:
                article_view: ~
                article_edit: ~
                article_delete: ~