| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- <?php
- namespace App\Console\Commands;
- use App\Module\System\Models\AdminMenu;
- use Illuminate\Console\Command;
- use Illuminate\Support\Facades\Route;
- use Illuminate\Support\Str;
- class CheckMenuRoutes extends Command
- {
- /**
- * The name and signature of the console command.
- *
- * @var string
- */
- protected $signature = 'admin:check-menu-routes {--delete : 是否删除无效的菜单项}';
- /**
- * The console command description.
- *
- * @var string
- */
- protected $description = '检查菜单项是否指向有效的路由,特别是那些可能会导致404错误的菜单项';
- /**
- * 已知的有效路由前缀
- *
- * @var array
- */
- protected $validPrefixes = [
- 'auth', 'dashboard', 'helpers', 'media', 'settings', 'logs', 'config'
- ];
- /**
- * Execute the console command.
- *
- * @return int
- */
- public function handle()
- {
- $this->info("开始检查菜单项是否指向有效的路由...");
-
- // 获取所有菜单项
- $menus = AdminMenu::all();
-
- // 获取所有路由
- $routes = Route::getRoutes();
- $routeUris = [];
-
- foreach ($routes as $route) {
- if (Str::startsWith($route->uri(), 'admin/')) {
- $routeUris[] = str_replace('admin/', '', $route->uri());
- }
- }
-
- $validMenus = [];
- $invalidMenus = [];
-
- foreach ($menus as $menu) {
- // 跳过空URI的菜单项(父菜单)
- if (empty($menu->uri)) {
- continue;
- }
-
- // 跳过已知有效的路由前缀
- $isValidPrefix = false;
- foreach ($this->validPrefixes as $prefix) {
- if (Str::startsWith($menu->uri, $prefix)) {
- $isValidPrefix = true;
- break;
- }
- }
-
- if ($isValidPrefix) {
- $validMenus[] = $menu;
- continue;
- }
-
- // 检查URI是否存在于路由中
- $uri = ltrim($menu->uri, '/');
- $isValid = false;
-
- foreach ($routeUris as $routeUri) {
- if (Str::startsWith($routeUri, $uri) || $routeUri === $uri) {
- $isValid = true;
- break;
- }
- }
-
- if ($isValid) {
- $validMenus[] = $menu;
- } else {
- $invalidMenus[] = $menu;
- }
- }
-
- // 显示有效的菜单项
- $this->info("\n有效的菜单项(有对应的路由): " . count($validMenus) . " 个");
-
- // 显示无效的菜单项
- if (count($invalidMenus) > 0) {
- $this->info("\n无效的菜单项(没有对应的路由): " . count($invalidMenus) . " 个");
-
- $table = [];
- foreach ($invalidMenus as $menu) {
- $table[] = [
- 'id' => $menu->id,
- 'title' => $menu->title,
- 'uri' => $menu->uri,
- 'parent_id' => $menu->parent_id,
- 'order' => $menu->order
- ];
- }
-
- $this->table(['ID', '标题', 'URI', '父ID', '排序'], $table);
-
- // 删除无效的菜单项
- if ($this->option('delete') || $this->confirm('是否要删除这些无效的菜单项?')) {
- foreach ($invalidMenus as $menu) {
- // 获取子菜单
- $childMenus = AdminMenu::where('parent_id', $menu->id)->get();
-
- // 更新子菜单的父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}");
- }
-
- $this->info("\n已删除 " . count($invalidMenus) . " 个无效的菜单项");
- }
- } else {
- $this->info("\n所有菜单项都指向有效的路由!");
- }
-
- return 0;
- }
- }
|