前面寫了一篇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;
在數據庫里的表現:

在頁面上的表現:

使用方式:
<ul id="main-menu" class="main-menu">
<li class="<?php if (Yii::$app->controller->id == 'site'){echo 'active';}?>">
<a href="/site/index">
<i class="linecons-cloud"></i>
<span class="title">HOME</span>
</a>
</li>
<?php $i=0;foreach (MenuHelper::getAssignedMenu(\Yii::$app->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;
}
?>
<li <?php echo $if_menu==1?'class="active"':''; ?>>
<a href="<?php echo $p_menu['url']; ?>">
<i class="<?php echo $linecons[$i];$i++; ?>"></i>
<span class="title"><?=$p_menu['label']?></span>
</a>
<?php if(!empty($p_menu['items'])){ ?>
<ul <?php echo $if_menu==1?'style="display: block;"':''; ?>>
<?php foreach ($p_menu['items'] as $c_menu) {?>
<li>
<a href="<?= $c_menu['url'][0] ?>">
<span class="title"><?= $c_menu['label'] ?></span>
</a>
</li>
<?php } ?>
</ul>
<?php } ?>
</li>
<?php }else{ ?>
<li>
<a href="<?= $p_menu['url'][0] ?>"><i class="icon-bar-chart"></i><?=$p_menu['label']?></a>
</li>
<?php }} ?>
</ul>
這里使用到啦yii2-admin下的MenuHelper類getAssignedMenu方法,該方法用於獲取用戶對應的菜單信息.
在config\params.php下配置
return [
'adminEmail' => 'admin@example.com',
'mdm.admin.configs' => [
'db' => 'db',
'menuTable' => '{{%yc_menu}}',
'cache' => null,
'cacheDuration' => 3600
],
];
最終顯示結果:

