xiidea / easy-menu-acl-bundle

基于角色的访问过滤,适用于 Symfony2 KnpMenuBundle

安装: 103

依赖: 0

建议者: 0

安全: 0

星标: 2

关注者: 2

分支: 1

公开问题: 0

类型:symfony2-bundle

1.0.0 2015-03-05 02:07 UTC

This package is not auto-updated.

Last update: 2024-09-14 17:11:10 UTC


README

一个用于增强 KnpMenuBundle 的 Symfony2 Bundle。此 Bundle 可用于通过简单配置注册菜单,或者可以在零配置下根据安全访问级别过滤菜单。

注意:如果您使用的是 Symfony 版本 低于 2.6,您需要使用 EasyMenuAclBundle 1.x

安装

  1. 在 composer.json 中添加 EasyMenuAclBundle
  2. 启用 Bundle
  3. 配置 config.yml(可选)

1. 在 composer.json 中添加 EasyMenuAclBundle

在 composer.json 中添加 EasyMenuAclBundle

{
    "require": {
        "xiidea/easy-menu-acl-bundle": "2.0.*@dev"
    }
}

现在运行以下命令让 composer 下载该 Bundle

$ php composer.phar update xiidea/easy-menu-acl-bundle

Composer 将将 Bundle 安装到您的项目目录的 vendor/xiidea 中。

2. 启用 Bundle

<?php
// app/AppKernel.php

public function registerBundles()
{
    $bundles = array(
        // ...
        new Xiidea\EasyMenuAclBundle\XiideaEasyMenuAclBundle(),
    );
}

3. 配置 config.yml

# app/config/config.yml
xiidea_easy_menu_acl:
    # builders : [main, sidebar]

食谱

您可以使用此 Bundle 以三种方式。

1 使用事件监听器注册菜单。

首先定义您需要的菜单的构建器配置。

# app/config/config.yml
xiidea_easy_menu_acl:
    builders : [main, sidebar]

然后定义事件监听器服务,监听 xiidea.easy_menu_build_{THE_MENU_NAME}。例如配置中会有两个事件 xiidea.easy_menu_build_mainxiidea.easy_menu_build_sidebar

# service.yml
    menu_build_listener:
        class: AppBundle\EventListener\MenuListener
        arguments: [@event_dispatcher]
        tags:
            - { name: kernel.event_listener, event: xiidea.easy_menu_build_main, method: buildMainMenu}
            - { name: kernel.event_listener, event: xiidea.easy_menu_build_sidebar, method: buildSideBarMenu}

定义菜单监听器类

<?php
class MainMenuListener
{

    /**
     * @var TraceableEventDispatcher
     */
    private $dispatcher;

    public function __construct(TraceableEventDispatcher $dispatcher){

        $this->dispatcher = $dispatcher;
    }

    /**
     * @param EasyMenuEvent $event
     */
    public function buildMainMenu(EasyMenuEvent $event)
    {
        $menu = $event->getMenu();
        $factory = $event->getFactory();

        $menu->addChild('Home', array('uri' => '/'));
        $menu->addChild('Reports', array('route' => 'report_route'));

        //..

    }

    /**
     * @param EasyMenuEvent $event
     */
    public function buildSideBarMenu(EasyMenuEvent $event)
    {
        $menu = $event->getMenu();
        $factory = $event->getFactory();

        $menu->addChild('Home Page', array('uri' => '/'));
        $menu->addChild('Reports', array('route' => 'report_route'));

        //..

    }
}

2. 零配置事件分发

您可以在不配置的情况下使用此 Bundle。您需要构建菜单后,分发一个事件 xiidea.easy_menu_acl_post_build。例如:

<?php
//Menu builder

use Xiidea\EasyMenuAclBundle\Event\EasyMenuEvent;

class MenuBuilder extends ContainerAware
{
    public function mainMenu(FactoryInterface $factory, array $options)
    {
        $menu = $factory->createItem('root');

        $menu->addChild('Home', array('uri' => '/'));

        $menu->addChild('Reports', array('route' => 'report_route'));

        //.....

        $this->container->get('event_dispatcher')->dispatch(
            "xiidea.easy_menu_acl_post_build",
            new EasyMenuEvent($factory, $menu)
        );

        return $menu;
    }

3. 零配置使用访问过滤器服务

您可以使用 xiidea.easy_menu_acl.access_filter 并对菜单对象应用过滤。

<?php
//Menu builder

class MenuBuilder extends ContainerAware
{
    public function mainMenu(FactoryInterface $factory, array $options)
    {
        $menu = $factory->createItem('root');

        $menu->addChild('Home', array('uri' => '/'));

        $menu->addChild('Reports', array('route' => 'report_route'));

        //.....

        $this->container->get('xiidea.easy_menu_acl.access_filter')->apply($menu);

        return $menu;
    }