沙滩星空的博客沙滩星空的博客

Laravel后台框架Dcat Admin更改侧边菜单读取方式

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
未经允许不得转载:沙滩星空的博客 » Laravel后台框架Dcat Admin更改侧边菜单读取方式

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址