| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- <?php
- namespace App\Console\Commands;
- use App\Module\System\Models\AdminMenu;
- use Illuminate\Console\Command;
- use Illuminate\Support\Facades\Route;
- use Illuminate\Support\Str;
- /**
- * 获取菜单详情命令
- *
- * 根据菜单ID获取菜单项的详细信息,包括子菜单和URI有效性检查
- */
- class GetMenuById extends Command
- {
- /**
- * The name and signature of the console command.
- *
- * @var string
- */
- protected $signature = 'admin:get-menu {id : 菜单项ID} {--delete : 是否删除该菜单项}';
- /**
- * The console command description.
- *
- * @var string
- */
- protected $description = '获取特定ID的菜单项详细信息';
- /**
- * Execute the console command.
- *
- * @return int
- */
- public function handle()
- {
- $id = $this->argument('id');
- // 获取菜单项
- $menu = AdminMenu::find($id);
- if (!$menu) {
- $this->error("未找到ID为{$id}的菜单项");
- return 1;
- }
- $this->info("菜单项详细信息:");
- $this->table(
- ['属性', '值'],
- [
- ['ID', $menu->id],
- ['标题', $menu->title],
- ['URI', $menu->uri],
- ['父ID', $menu->parent_id],
- ['排序', $menu->order],
- ['图标', $menu->icon],
- ['显示', $menu->show ? '是' : '否'],
- ['创建时间', $menu->created_at],
- ['更新时间', $menu->updated_at]
- ]
- );
- // 获取子菜单
- $childMenus = AdminMenu::where('parent_id', $menu->id)->get();
- if ($childMenus->isNotEmpty()) {
- $this->info("\n子菜单:");
- $table = [];
- foreach ($childMenus as $childMenu) {
- $table[] = [
- 'id' => $childMenu->id,
- 'title' => $childMenu->title,
- 'uri' => $childMenu->uri,
- 'order' => $childMenu->order,
- 'show' => $childMenu->show ? '是' : '否'
- ];
- }
- $this->table(['ID', '标题', 'URI', '排序', '显示'], $table);
- } else {
- $this->info("\n没有子菜单");
- }
- // 检查URI是否有效
- if (!empty($menu->uri)) {
- $this->info("\n检查URI是否有效:");
- // 获取所有路由
- $routes = Route::getRoutes();
- $routeUris = [];
- foreach ($routes as $route) {
- if (Str::startsWith($route->uri(), 'admin/')) {
- $routeUris[] = str_replace('admin/', '', $route->uri());
- }
- }
- // 获取所有模块的控制器
- $modules = [
- 'Activity', 'Article', 'Farm', 'File', 'Fund', 'Game', 'GameItems',
- 'OAuth', 'Pet', 'Sms', 'System', 'Task', 'Team', 'User'
- ];
- $controllerUris = [];
- foreach ($modules as $module) {
- $controllerDir = app_path("Module/{$module}/AdminControllers");
- if (!is_dir($controllerDir)) {
- continue;
- }
- $controllers = array_filter(scandir($controllerDir), function($file) {
- return !in_array($file, ['.', '..']) &&
- pathinfo($file, PATHINFO_EXTENSION) === 'php' &&
- !Str::contains($file, 'Helper');
- });
- foreach ($controllers as $controller) {
- $controllerName = pathinfo($controller, PATHINFO_FILENAME);
- $uri = $this->getControllerUri($controllerName);
- $controllerUris[] = $uri;
- }
- }
- $uri = ltrim($menu->uri, '/');
- $isValidRoute = false;
- $isValidController = false;
- // 检查路由
- foreach ($routeUris as $routeUri) {
- if (Str::startsWith($routeUri, $uri) || $routeUri === $uri) {
- $isValidRoute = true;
- break;
- }
- }
- // 检查控制器
- foreach ($controllerUris as $controllerUri) {
- if ($controllerUri === $uri) {
- $isValidController = true;
- break;
- }
- }
- if ($isValidRoute) {
- $this->info(" - 路由: 有效");
- } else {
- $this->error(" - 路由: 无效");
- }
- if ($isValidController) {
- $this->info(" - 控制器: 有效");
- } else {
- $this->error(" - 控制器: 无效");
- }
- if (!$isValidRoute && !$isValidController) {
- $this->error(" - URI无效,可能会导致404错误");
- // 删除菜单项
- if ($this->option('delete') || $this->confirm('是否要删除此菜单项?')) {
- // 更新子菜单的父ID
- foreach ($childMenus as $childMenu) {
- $childMenu->parent_id = $menu->parent_id;
- $childMenu->save();
- $this->info(" - 更新子菜单: ID = {$childMenu->id}, 标题 = {$childMenu->title}, 新父ID = {$menu->parent_id}");
- }
- // 删除菜单项
- $menu->delete();
- $this->info(" - 已删除菜单项: ID = {$menu->id}, 标题 = {$menu->title}, URI = {$menu->uri}");
- }
- }
- }
- return 0;
- }
- /**
- * 根据控制器名称猜测URI
- *
- * @param string $controllerName
- * @return string
- */
- protected function getControllerUri(string $controllerName): string
- {
- // 移除Controller后缀
- $name = str_replace('Controller', '', $controllerName);
- // 转换为kebab-case
- $uri = Str::kebab($name);
- return $uri;
- }
- }
|