|
|
@@ -3,86 +3,106 @@
|
|
|
namespace Longyi\DynamicMenu\Providers;
|
|
|
|
|
|
use Illuminate\Support\ServiceProvider;
|
|
|
-use Illuminate\Support\Facades\Route; // 添加这行!很重要
|
|
|
-use Illuminate\Support\Facades\Event;
|
|
|
-use Longyi\DynamicMenu\Http\Middleware\CheckMenuPermission;
|
|
|
+use Illuminate\Support\Facades\Cache;
|
|
|
+use Longyi\DynamicMenu\Models\MenuItem;
|
|
|
|
|
|
class DynamicMenuServiceProvider extends ServiceProvider
|
|
|
{
|
|
|
public function boot()
|
|
|
{
|
|
|
+ // 加载迁移
|
|
|
$this->loadMigrationsFrom(__DIR__ . '/../Database/Migrations');
|
|
|
+
|
|
|
+ // 加载路由
|
|
|
$this->loadRoutesFrom(__DIR__ . '/../Routes/admin-routes.php');
|
|
|
+
|
|
|
+ // 加载视图
|
|
|
$this->loadViewsFrom(__DIR__ . '/../Resources/views', 'dynamicmenu');
|
|
|
+ // 加载语言文件
|
|
|
$this->loadTranslationsFrom(__DIR__ . '/../Resources/lang', 'dynamicmenu');
|
|
|
-
|
|
|
+ // 发布资源
|
|
|
$this->publishes([
|
|
|
__DIR__ . '/../../publishable/assets' => public_path('vendor/dynamicmenu'),
|
|
|
], 'public');
|
|
|
-
|
|
|
- // 注册菜单
|
|
|
- $this->registerAdminMenu();
|
|
|
}
|
|
|
|
|
|
public function register()
|
|
|
{
|
|
|
- $this->mergeConfigFrom(
|
|
|
- __DIR__ . '/../Config/menu.php', 'menu.admin'
|
|
|
- );
|
|
|
- $this->app->singleton('dynamicmenu', function () {
|
|
|
- return new \Longyi\DynamicMenu\DynamicMenu();
|
|
|
+ // 延迟合并配置,等到服务提供者注册完成后
|
|
|
+ $this->app->booted(function () {
|
|
|
+ $this->mergeDynamicMenuConfig();
|
|
|
});
|
|
|
}
|
|
|
|
|
|
- protected function registerAdminMenu()
|
|
|
+ /**
|
|
|
+ * 合并动态菜单配置
|
|
|
+ */
|
|
|
+ protected function mergeDynamicMenuConfig()
|
|
|
{
|
|
|
- Event::listen('bagisto.admin.menu.build', function ($menu) {
|
|
|
- // 在 Settings 菜单下添加 Dynamic Menu
|
|
|
- $menu->add('settings.dynamic-menu', 'dynamicmenu::app.admin.menu.title', 'admin.dynamicmenu.index', 5, 'icon-menu')
|
|
|
- ->addSub('settings.dynamic-menu.items', 'dynamicmenu::app.admin.menu.items', 'admin.dynamicmenu.index', 1, 'icon-list')
|
|
|
- ->addSub('settings.dynamic-menu.permissions', 'dynamicmenu::app.admin.menu.permissions', 'admin.dynamicmenu.permission', 2, 'icon-permission');
|
|
|
- });
|
|
|
+ try {
|
|
|
+ // 从数据库获取菜单配置
|
|
|
+ $menuConfig = $this->getMenuConfigFromDatabase();
|
|
|
+ // 获取现有配置
|
|
|
+ $existingConfig = $this->app['config']->get('menu.admin', []);
|
|
|
+ // 合并配置
|
|
|
+ $mergedConfig = array_merge($existingConfig, $menuConfig);
|
|
|
+ // 设置配置
|
|
|
+ $this->app['config']->set('menu.admin', $mergedConfig);
|
|
|
+
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ \Log::error('合并动态菜单配置失败: ' . $e->getMessage());
|
|
|
+ }
|
|
|
}
|
|
|
- protected function registerMenu()
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 从数据库获取菜单配置
|
|
|
+ */
|
|
|
+ protected function getMenuConfigFromDatabase()
|
|
|
{
|
|
|
- $this->app->booted(function () {
|
|
|
- if (!$this->app->runningInConsole()) {
|
|
|
- $this->app['events']->listen('bagisto.menu.admin.build', function ($menu) {
|
|
|
- $this->buildMenu($menu);
|
|
|
- });
|
|
|
+ $menuItems = MenuItem::with('children')
|
|
|
+ ->where('status', 1)
|
|
|
+ ->orderBy('sort_order')
|
|
|
+ ->get();
|
|
|
+
|
|
|
+ return $this->buildMenuConfig($menuItems);
|
|
|
+ // 使用缓存
|
|
|
+ /*
|
|
|
+ return Cache::remember('dynamic_menu_config', 3600, function () {
|
|
|
+ try {
|
|
|
+ $menuItems = MenuItem::with('children')
|
|
|
+ ->whereNull('parent_id')
|
|
|
+ ->where('status', 1)
|
|
|
+ ->orderBy('sort_order')
|
|
|
+ ->get();
|
|
|
+
|
|
|
+ return $this->buildMenuConfig($menuItems);
|
|
|
+
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ \Log::warning('无法从数据库获取菜单: ' . $e->getMessage());
|
|
|
+ return [];
|
|
|
}
|
|
|
});
|
|
|
+ */
|
|
|
}
|
|
|
-
|
|
|
- protected function buildMenu($menu)
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 构建菜单配置数组
|
|
|
+ */
|
|
|
+ protected function buildMenuConfig($menuItems)
|
|
|
{
|
|
|
- try {
|
|
|
- // 从数据库加载菜单项
|
|
|
- $items = \Longyi\DynamicMenu\Models\MenuItem::where('status', 1)
|
|
|
- ->orderBy('parent_id')
|
|
|
- ->orderBy('sort_order')
|
|
|
- ->get();
|
|
|
-
|
|
|
- foreach ($items as $item) {
|
|
|
- // 确保 key 存在
|
|
|
- if (empty($item->key)) {
|
|
|
- \Log::warning('菜单项缺少 key', ['id' => $item->id, 'name' => $item->name]);
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
- $parentKey = $item->parent ? $item->parent->key : null;
|
|
|
-
|
|
|
- $menu->addItem(
|
|
|
- $item->key,
|
|
|
- $item->name,
|
|
|
- $parentKey,
|
|
|
- $item->route,
|
|
|
- $item->icon,
|
|
|
- (int) $item->sort_order
|
|
|
- );
|
|
|
- }
|
|
|
- } catch (\Exception $e) {
|
|
|
- // 表可能不存在,静默失败
|
|
|
+ $config = [];
|
|
|
+
|
|
|
+ foreach ($menuItems as $item) {
|
|
|
+ $menuItem = [
|
|
|
+ 'key' => $item->key,
|
|
|
+ 'name' => $item->name,
|
|
|
+ 'route' => $item->route ?: 'admin.dynamicmenu.index',
|
|
|
+ 'sort' => (int) $item->sort_order,
|
|
|
+ 'icon' => $item->icon ?: 'icon-menu',
|
|
|
+ ];
|
|
|
+ $config[] = $menuItem;
|
|
|
}
|
|
|
+
|
|
|
+ return $config;
|
|
|
}
|
|
|
}
|