前面写了一篇Yii2-admin RBAC权限管理的实现 有朋友在评论里问了关于menu的使用,在这里我做一下统一的回答,稍微讲解一下我平时在项目中是怎么使用menu的。
menu表是根据权限来控制后台菜单的显示和隐藏的。
先来看看表结构:
-- ----------------------------
-- Table structure for yc_menu
-- ----------------------------
DROP TABLE IF EXISTS `yc_menu`;
CREATE TABLE `yc_menu` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(128) NOT NULL,
`parent` int(11) DEFAULT NULL,
`route` varchar(256) DEFAULT NULL,
`order` int(11) DEFAULT NULL,
`data` text,
PRIMARY KEY (`id`),
KEY `parent` (`parent`),
KEY `name` (`name`),
KEY `route` (`route`(255)),
KEY `order` (`order`),
CONSTRAINT `dh_menu_ibfk_1` FOREIGN KEY (`parent`) REFERENCES `dh_menu` (`id`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='系统管理员菜单权限表';
这里详细介绍几个主要的字段:
name 是菜单的名称;
parent 是父类菜单的名称,留空则表示顶级菜单;
route 指的是菜单的URL;
在数据库里的表现:
在页面上的表现:
使用方式:
-
HOME
user->id) as $k=>$p_menu) {
if(!empty($p_menu['items'])){
$if_menu=0;
$url=parse_url($_SERVER["REQUEST_URI"]);
$url_arr = array_filter(explode("/", $url['path']));
$url_items=$item_arr=[];
//根据URL判断显示
foreach($p_menu['items'] as $val){
if($val['url'][0]){
$item_arr = array_filter(explode("/", $val['url'][0]));
}
$url_items[]=$item_arr[1];
}
if(isset($url_arr[1]) && in_array($url_arr[1], $url_items)){
$if_menu=1;
}
?>
- >
=$p_menu['label']?>
-
=$p_menu['label']?>
这里使用到啦yii2-admin下的MenuHelper类getAssignedMenu方法,该方法用于获取用户对应的菜单信息.
在config\params.php下配置
return [
'adminEmail' => '[email protected]',
'mdm.admin.configs' => [
'db' => 'db',
'menuTable' => '{{%yc_menu}}',
'cache' => null,
'cacheDuration' => 3600
],
];
最终显示结果: