Dcat Admin 是基于 Laravel 框架的一套后台管理系统。
使用很少的代码快速构建功能完善的高颜值后台系统,内置丰富的后台常用组件,开箱即用,让开发者告别冗杂的HTML代码。
但是,日常开发中,有时候会有一些小项目,没有权限管理,也不需要很复杂的菜单配置。我们可能希望,把后台菜单直接写到源码的菜单配置文件,而 Dcat Admin 的菜单,默认只能读取数据库菜单数据表。下面我们来做一些设置,实现该功能。
1. 修改 config/admin.php
文件:
新增 menu.engine 配置项,如下所示:
'menu' => [
'engine' => env("ADMIN_MENU_ENGINE",'file'), // 这个是新增的
'cache' => [
// enable cache or not
'enable' => false,
'store' => 'file',
],
// Whether enable menu bind to a permission.
'bind_permission' => true,
],
2. 修改 .env
文件:
新增自定义菜单引擎配置项 ADMIN_MENU_ENGINE=file 。配置为 file 和 database 之一,默认为 file 。
3. 新建 App\Admin\helpers\Menu
自定义菜单文件类
路径 app/Admin/helpers/Menu.php
<?php
namespace App\Admin\helpers;
use Dcat\Admin\Support\Helper;
use Dcat\Admin\Admin;
class Menu
{
static public function render(){
self::setLeftSidebarMenu();
}
static protected function getEngines(){
return [
'file' => function(){
return self::getSidebarDataFromFile();
},
'database' => function(){
return self::getSidebarDataFromDatabase();
}
];
}
static protected function setLeftSidebarMenu(){
$engine = config('admin.menu.engine');
$engineMap = self::getEngines();
// $items = $engineMap[$engine]; // 错误
$items = $engineMap[$engine](); // 正确
admin_inject_section(\AdminSection::LEFT_SIDEBAR_MENU, function ()use($items) {
$builder = Admin::menu();
$html = '';
foreach ($items as $item) {
$html .= view('admin::partials.menu', ['item' => $item, 'builder' => $builder])->render();
}
return $html;
});
}
/**
* 框架自带左侧菜单,从数据库读取
* @return array
*/
static protected function getSidebarDataFromDatabase(){
$menuModel = config('admin.database.menu_model');
$allNodes = (new $menuModel())->allNodes();
return Helper::buildNestedArray($allNodes);
}
/**
* 左侧菜单改为从文件内容读取
* @return array
*/
static protected function getSidebarDataFromFile(){
return Helper::buildNestedArray(require __DIR__ . "/menus.php");
}
}
4. 新建菜单文件:menus.php
和上面新建的自定义菜单文件类 Menu.php 在同一个目录。权限配置 permissions 和角色配置 roles , 默认可省略。
return [
['id'=>1,'parent_id'=>0,'title'=>'Index','icon'=>'feather icon-bar-chart-2','uri'=>'/','permissions'=>[],'roles'=>[]],
['id'=>2,'parent_id'=>0,'title'=>'Admin','icon'=>'feather icon-settings','uri'=>''],
['id'=>3,'parent_id'=>2,'title'=>'Users','icon'=>'','uri'=>'auth/users'],
['id'=>3,'parent_id'=>2,'title'=>'Roles','icon'=>'','uri'=>'auth/roles'],
['id'=>3,'parent_id'=>2,'title'=>'Permission','icon'=>'','uri'=>'auth/permissions'],
['id'=>3,'parent_id'=>2,'title'=>'Menu','icon'=>'','uri'=>'auth/menu'],
['id'=>3,'parent_id'=>2,'title'=>'Operation log','icon'=>'','uri'=>'auth/logs'],
];
5. 在 app/Admin/bootstrap.php 文件中注入自定义菜单文件代码:
<?php
use Dcat\Admin\Admin;
use App\Admin\helpers\Menu;
...
Admin::asset()->alias('@nunito', null, '');
Admin::asset()->alias('@montserrat', null, '');
// 上面的两行代码,用来禁用谷歌字体加载。否则你的网页在国内加载会卡半天。
// 下面这行才是本文的重点
Menu::render();
6. 最后,执行控制台命令更新缓存,收尾。
因为更改了 config/admin.php
配置文件,所以,需要更新配置缓存到 bootstrap/cache/config.php 中。
在控制台执更新缓存的命令,否则上面所有操作是无法立即生效的。
php artisan config:cache