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'); } public function register() { // 延迟合并配置,等到服务提供者注册完成后 $this->app->booted(function () { $this->mergeDynamicMenuConfig(); }); if ($this->app->runningInConsole()) { $this->commands([ \Longyi\DynamicMenu\Console\Commands\InitializeSettings::class, ]); } } /** * 合并动态菜单配置 */ protected function mergeDynamicMenuConfig() { 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 getMenuConfigFromDatabase($useCache = true) { if (!$useCache) { // 不使用缓存,直接查询数据库 $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') ->where('status', 1) ->orderBy('sort_order') ->get(); return $this->buildMenuConfig($menuItems); } catch (\Exception $e) { \Log::warning('无法从数据库获取菜单:' . $e->getMessage()); return []; } }); } // ... existing code ... /** * 构建菜单配置数组 */ protected function buildMenuConfig($menuItems) { $config = []; foreach ($menuItems as $item) { $routeParameters = $this->parseRouteParameters($item->route_parameters); $menuItem = [ 'key' => $item->key, 'name' => $item->name, 'route' => $item->route ?: 'admin.dynamicmenu.index', 'route_parameters' => $routeParameters, 'sort' => (int) $item->sort_order, 'icon' => $item->icon ?: 'icon-menu', ]; $config[] = $menuItem; } return $config; } /** * 解析路由参数 */ protected function parseRouteParameters($parameters): array { if (empty($parameters)) { return []; } // 如果已经是数组,直接返回 if (is_array($parameters)) { return array_values(array_filter($parameters)); } // 如果是 JSON 字符串,解码 if (is_string($parameters)) { // 尝试 JSON 解码 $decoded = json_decode($parameters, true); if (is_array($decoded)) { return array_values(array_filter($decoded)); } // 如果不是有效的 JSON,尝试按逗号分割 if (strpos($parameters, ',') !== false) { return array_values(array_filter(array_map('trim', explode(',', $parameters)))); } // 单个字符串参数 return [$parameters]; } return []; } }