xiidea / easy-menu-acl-bundle
基于角色的访问过滤,适用于 Symfony2 KnpMenuBundle
1.0.0
2015-03-05 02:07 UTC
Requires
- php: >=5.3.0
- knplabs/knp-menu-bundle: 2.0.*
Requires (Dev)
- mockery/mockery: >=0.7.2
- phpunit/phpunit: 4.5.*
- satooshi/php-coveralls: ~0.6
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
安装
- 在 composer.json 中添加 EasyMenuAclBundle
- 启用 Bundle
- 配置 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_main
和 xiidea.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; }