Yii2 rbac权限控制之菜单menu实例教程


Posted in PHP onApril 28, 2016

在上篇文章给大家介绍了yii2搭建完美后台并实现rbac权限控制实例教程中完美实现了yii2的后台搭建和rbac权限控制,如果你还没有实现,请先看上文再回来参考本文,因为本文是在上文的基础上进行完善和补充。

部分小伙们纷纷反映,最后菜单menu怎么控制权限呀,看不懂,搞不定,而且你那貌似没搞完,瞎忽悠!确实没那么全,今天看我们如何实现菜单完美权限化。先罗列下主要讲的内容,不需要的没必要看下去,只为分享给有需要的人。

利用menu表添加菜单

左侧菜单结果adminlte完美呈现

菜单前面自定义icon小图标并呈现

如何控制菜单的显示或者隐藏

页面操作按钮没权限的不做显示

gridview中也只显示有操作权限的按钮

嗯,差不多就这么多,如果你还有其他的有关权限控制菜单的需求,请下方留言,咱们共同切磋交流。

先看图预览下大致效果,不然怎么激起你们好学的心。

Yii2 rbac权限控制之菜单menu实例教程

首先我们先访问路由页面 /dmin/route/index ,尽可能的把左侧的全部选中,然后移动到右侧,,然后记得给当前用户分配相关的可访问权限哦。

接下来访问菜单列表 /admin/menu/index 点击添加菜单,如果这个时候你没有权限访问了,请你在配置文件的 as access文件内暂时允许当前用户访问任意权限,并在我们添加完权限的时候去掉as access的设置,一定要记得哦,不然权限失效了可别回来找我。

Yii2 rbac权限控制之菜单menu实例教程

这里我们先填写上图中标红的四个字段

举个例子:我们要添加一级菜单"权限管理"

名称请填写"权限管理",因为是一级菜单,父级名称请留空,路由我们这里选择"/admin/default/index",注意了,如果匹配到任何路由,请访问路由页面把左侧的选中移动到右侧。

映射,其实就是排序高低的问题,比如说我添加了两个菜单,映射值为1的就在上面 值为2的就在1的下面,我们这里填写数字1。

"数据"这一项我们后面再说。

按照刚刚介绍的这种方式添加吧,举一个添加二级菜单"权限控制"的例子

只需要把父级名称这里填写我们刚刚添加成功的一级名称"权限管理"即可。其他照旧。不会操作的多看两遍,这里最好把权限管理的几个菜单全部添加完毕,因为接下来我们需要且你可以多练练手嘛。

到此我们已经会添加菜单了。

我们来看下一步,利用我们之前搭建的后台框架进行展现。

use mdm\admin\components\MenuHelper; 
echo dmstr\widgets\Menu::widget( [
'options' => ['class' => 'sidebar-menu'], 
'items' => MenuHelper::getAssignedMenu(Yii::$app->user->id), 
] );

是不是很简单,What?我的怎么没有dmstr这玩意,不好意思,已经说的很多遍,需要先看上文再有这个菜单的结合。

ok,刷新页面看看你的菜单,虽然我们还没完全实现我们想要的功能,不过到此你应该能看到你的菜单展现了。

接下来将进入我们的重点以及难点,我们要实现菜单前面的小图标且完成菜单可隐藏控制。

还记得我们一开始创建菜单的时候,唯一没进行填写的选项"数据"吗?为了后续操作方便,我们这里一并把图标和隐藏的选项都填写上。我们以开始截图中的"后台用户管理"这个二级菜单为例进行修改。截图大家先看看我们的菜单目前的状态,

Yii2 rbac权限控制之菜单menu实例教程

请在其更新页面的“数据”项中务必填写下面的代码,如果你有新的想法,还请先按照我的思路后面再做修改,因为后面我们要进行操作。

{"icon": "fa fa-user", "visible": false}

是的,这个"数据"项我们填写的是一段json代码,接下来我们对展示菜单的代码也做稍微的整改,为了方便大家看代码,这里的$callback直接写在页面上了,回头大家可以继续封装优化。

use mdm\admin\components\MenuHelper; 
<?php 
$callback = function($menu){ 
$data = json_decode($menu['data'], true); 
$items = $menu['children']; 
$return = [ 
'label' => $menu['name'], 
'url' => [$menu['route']], 
]; 
//处理我们的配置 
if ($data) { 
//visible 
isset($data['visible']) && $return['visible'] = $data['visible']; 
//icon 
isset($data['icon']) && $data['icon'] && $return['icon'] = $data['icon']; 
//other attribute e.g. class... 
$return['options'] = $data; 
} 
//没配置图标的显示默认图标 
(!isset($return['icon']) || !$return['icon']) && $return['icon'] = 'fa fa-circle-o'; 
$items && $return['items'] = $items; 
return $return; 
}; 
//这里我们对一开始写的菜单menu进行了优化
echo dmstr\widgets\Menu::widget( [ 
'options' => ['class' => 'sidebar-menu'], 
'items' => MenuHelper::getAssignedMenu(Yii::$app->user->id, null, $callback), 
] ); ?>

是的,你没有看错,代码是有点长,我们来简单分析分析。其实我们这里的$callback方法也只是针对上面我们添加菜单的"数据"项进行的分析。不难看出,我们对icon和visible分别进行了判断,并追加到当前menu中。

到此,我们费了一番波折终于实现菜单加icon和设置菜单的隐藏。如果你有其他的属性需要进行配置,此处仍然可以继续单独配置。

现在,我们还有两个任务仍待完成,要完成接下来的两个任务,为了大家的方便,建议你的项目可以自定义配置gii模版,不支持自定义gii模板的可以参考自定义gii模版 当你发现我们后面需要做的功能,我觉得你会赞叹我们这里的操作。

为了方便操作,我们这里增加一个测试表test,我们先用未做修改的gii模版生成一份model+curd。我们先把test/*的所有权限分配给当前登录的用户,并添加一条数据。打开/test我们可以正常看到下面的截图,注意图中的两个标记。

Yii2 rbac权限控制之菜单menu实例教程

然后我们打开test/index.php文件,对标记的两个地方进行如下修改

use mdm\admin\components\Helper; 
<?php 
//没有创建权限不显示按钮 
if(Helper::checkRoute('create')) { 
echo Html::a('Create Test', ['create'], ['class' => 'btn btn-success']); 
} ?> 
<?= GridView::widget([ 
// ...... 
'columns' => [ 
// ...... 
[ 
'class' => 'yii\grid\ActionColumn', 
'template' => Helper::filterActionColumn('{view}{update}{delete}'), 
], 
], 
]); ?>

现在我们刷新下页面/test再看看,好像没什么变化嘛。别急,我们现在撤销当前用户的/test/create 权限和/test/update权限,然后你在刷新下页面看看效果,我们截图看看。

Yii2 rbac权限控制之菜单menu实例教程

也就是说我们没有权限的按钮消失了,当你手动访问/test/create的时候你会发现也会提醒你没有权限。

如果你的gii模板是自定义的,相信你会迅速在其生成的模板中所有的操作上添加权限控制的,是不是很happy

最后,我们的菜单menu关于权限控制的讲解基本也就结束了,长篇大论,仔细回想起来也没多少东西,倒是希望能帮到你一二

PHP 相关文章推荐
用PHP实现小型站点广告管理(修正版)
Oct 09 PHP
几个学习PHP的网址
Nov 25 PHP
发布一个迷你php+AJAX聊天程序[聊天室]提供下载
Jul 21 PHP
php邮件发送,php发送邮件的类
Mar 24 PHP
php中用foreach来操作数组的代码
Jul 17 PHP
解析使用substr截取UTF-8中文字符串出现乱码的问题
Jun 20 PHP
Thinkphp搭建包括JS多语言的多语言项目实现方法
Nov 24 PHP
PHP对文件进行加锁、解锁实例
Jan 23 PHP
thinkphp微信开发(消息加密解密)
Dec 02 PHP
zen cart实现订单中增加paypal中预留电话的方法
Jul 12 PHP
thinkPHP5.0框架应用请求生命周期分析
Mar 25 PHP
CentOS系统中PHP安装扩展的方式汇总
Apr 09 PHP
Yii2搭建后台并实现rbac权限控制完整实例教程
Apr 28 #PHP
PHP在线调试执行的实现方法(附demo源码)
Apr 28 #PHP
thinkphp项目部署到Linux服务器上报错“模板不存在”如何解决
Apr 27 #PHP
Composer设置忽略版本匹配的方法
Apr 27 #PHP
抛弃 PHP 代价太高
Apr 26 #PHP
PHP调用存储过程返回值不一致问题的解决方法分析
Apr 26 #PHP
PHP抓取及分析网页的方法详解
Apr 26 #PHP
You might like
SESSION存放在数据库用法实例
2015/08/08 PHP
php使用ffmpeg向视频中添加文字字幕的实现方法
2016/05/23 PHP
thinkPHP5框架设置404、403等http状态页面的方法
2018/06/05 PHP
纯js实现的论坛常用的运行代码的效果
2008/07/15 Javascript
用JS实现一个TreeMenu效果分享
2011/08/28 Javascript
基于jquery跨浏览器显示的file上传控件
2011/10/24 Javascript
利用JQuery动画制作滑动菜单项效果实现步骤及代码
2013/02/07 Javascript
javascript实现禁止复制网页内容
2014/12/16 Javascript
浅析AngularJS Filter用法
2015/12/28 Javascript
教你如何终止JQUERY的$.AJAX请求
2016/02/23 Javascript
jQuery实现鼠标经过像翻页和描点链接效果
2016/08/08 Javascript
薪资那么高的Web前端必看书单
2017/10/13 Javascript
JavaScript实现树的遍历算法示例【广度优先与深度优先】
2017/10/26 Javascript
vue-cli 使用vue-bus来全局控制的实例讲解
2018/09/15 Javascript
Nuxt项目支持eslint+pritter+typescript的实现
2019/05/20 Javascript
微信小程序实现左滑动删除效果
2020/03/30 Javascript
js实现图片区域可点击大小随意改变(适用移动端)代码实例
2019/09/11 Javascript
js计算最大公约数和最小公倍数代码实例
2019/09/11 Javascript
微信小程序云开发获取文件夹下所有文件(推荐)
2019/11/14 Javascript
《javascript设计模式》学习笔记三:Javascript面向对象程序设计单例模式原理与实现方法分析
2020/04/07 Javascript
如何使用RoughViz可视化Vue.js中的草绘图表
2021/01/30 Vue.js
python列表的常用操作方法小结
2016/05/21 Python
Python学习笔记之字符串和字符串方法实例详解
2019/08/22 Python
pycharm中导入模块错误时提示Try to run this command from the system terminal
2020/03/26 Python
如何在keras中添加自己的优化器(如adam等)
2020/06/19 Python
Silk’n激光脱毛器官网:silkn.com
2016/10/06 全球购物
英语翻译系毕业生求职信
2013/09/29 职场文书
法学院毕业生求职信
2014/06/25 职场文书
2014年租房协议书范本
2014/10/30 职场文书
病危通知单
2015/04/17 职场文书
哪类餐饮行业,最适合在高校创业?
2019/08/19 职场文书
Pytorch中的学习率衰减及其用法详解
2021/06/05 Python
MySQL优化常用的19种有效方法(推荐!)
2022/03/17 MySQL
关于vue-router-link选择样式设置
2022/04/30 Vue.js
MySQL安装失败的原因及解决步骤
2022/06/14 MySQL
Springboot中如何自动转JSON输出
2022/06/16 Java/Android