yii2项目实战-权限菜单管理

权限管理,前前后后我们罗嗦了那么多,该有个了断了!有同学私聊反映说,这项目讲来讲去什么时候是个头呢?我们这里简单说一下:后期,我们把yii2基础知识的运用讲解完,还会继续讲解一些yii2参与博客业务逻辑的处理以及实际碰到的各种问题,以此来丰富我们实际的项目开发经验。

再后面,我们现在已经完善了swoole的基础知识,通过swoole的学习更能提高phper的技术能力,希望能帮到大家!

本章节我们做什么呢?到这里,我们的权限管理按照最小粒度-路由进行分配控制,功能上已经差不多了。我们也整合了友好的界面化组件yii2-admin,但是到上一章节中,我们所有的操作,都是手动在地址栏输入链接进行访问。如果工作中这么来操作,保准你今天项目上线,明天卷铺盖走人。

不知道大家是否注意到adminlte左侧的菜单栏,如果我们把用户所拥有的权限显示在左侧菜单栏,是不是就更加友好了呢?注意,我们这里说的用户所拥有的权限,指的是路由。但是我们总不可能直接给管理用户直接在左侧显示路由,说 xxx/xxx 就是博客的列表,这体验可就成了问题了。

如果我们新建一张数据表,给路由起个别名,别名对应路由权限,这样是不是就好多了?仔细想一下,如此一来,菜单还需要有父子层级、排序以及菜单选中高亮状态等功能。我们把菜单理解为一个功能模块,其实还是挺复杂的。但是,你能想到的yii2的复杂,你的前辈们早就想到了好的解决方案,就看你能不能想出更优秀的方案把他们扑倒在沙滩上了!

yii2-admin2 也封装性的解决了我们上述描述的问题,我们来看看具体操作!

1、利用migrate创建menu数据表

1
2
3
4
5
./yii migrate/to m140602_111327_create_menu_table.php  --migrationPath=@mdm/admin/migrations

# m140602_111327_create_menu_table.php 是我们要执行的menu数据表,
# 在vendor\mdmsoft\yii2-admin\migrations目录下,这个每个人可能是不同的,需要自己手动修改
windows用户自行把前面的 “./” 去掉即可。

2、使用我们上一章节分配了用户管理权限的帐号登录系统,(未分配的可以先暂时为as access设定 ,把权限管理分配给用户后再屏蔽掉即可)访问 /index.php?r=admin/menu

创建两个菜单:

一个Name为“权限管理”,Order为“1”的的父级,

一个Name为“菜单”,Order为“1”,Route为 “/admin/menu/index” 的子级菜单

其他的菜单这里就不演示了,大家自己练习的时候可以把权限剩下的和博客管理系列的添加进来!

3、打开布局文件left.php,文件内的Html代码替换为下面的代码,代码的含义是借助yii2以及yii2-admin封装好的菜单组件,显示用户有权限的菜单。注意哦,如果用户对某操作有权限,但是你没为该权限添加菜单,这是不会显示在左侧,但是用户通过路由地址照样可以正常访问的,毕竟我们左侧管理的是菜单表!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php

use mdm\admin\components\MenuHelper;
use dmstr\widgets\Menu;
?>

<aside class="main-sidebar">
<section class="sidebar">
<?=
Menu::widget([
'options' => ['class' => 'sidebar-menu tree', 'data-widget'=> 'tree'],
'items' => MenuHelper::getAssignedMenu(Yii::$app->user->id)
]);
?>
</section>
</aside>

4、刷新下你的界面,左侧菜单理应是可以正常显示的,如果没有,请自己排除下以下原因:

确保你要显示的权限分配给用户了,可以在left.php打印下 MenuHelper::getAssignedMenu 的结果测试一下,如果结果为null,那一定是没分配成功
确保该权限已经添加到菜单表里面了
友情提醒,左侧的菜单风格很明显是可以自定义的,如果有能力又觉得自带的不好看,可自行扩展 dmstr\widgets\Menu widget

权限我们要告一段落,下一章节我们玩玩博客管理的操作,看看能不能玩出新花样!