|
|
@@ -0,0 +1,129 @@
|
|
|
+# 修复路由缓存冲突问题
|
|
|
+
|
|
|
+**时间**: 2025年06月18日 16:10:13 CST
|
|
|
+**任务**: 修复 `php artisan route:cache` 报错问题
|
|
|
+**状态**: ✅ 已完成
|
|
|
+
|
|
|
+## 问题描述
|
|
|
+
|
|
|
+运行 `php artisan route:cache` 时出现路由名称冲突错误:
|
|
|
+
|
|
|
+```
|
|
|
+LogicException
|
|
|
+
|
|
|
+Unable to prepare route [admin/openapi/stats] for serialization. Another route has already been assigned name [admin.openapi.stats.index].
|
|
|
+```
|
|
|
+
|
|
|
+## 问题分析
|
|
|
+
|
|
|
+通过代码检索发现有两个地方同时定义了相同的路由名称 `admin.openapi.stats.index`:
|
|
|
+
|
|
|
+1. **手动路由文件**: `app/Module/OpenAPI/Routes/admin.php` 第88-91行
|
|
|
+2. **Resource注解**: `app/Module/OpenAPI/AdminControllers/StatController.php` 第22-28行
|
|
|
+
|
|
|
+这导致了路由名称冲突,无法进行路由缓存。
|
|
|
+
|
|
|
+## 解决方案
|
|
|
+
|
|
|
+### 1. 删除重复的手动路由定义
|
|
|
+
|
|
|
+修改 `app/Module/OpenAPI/Routes/admin.php`:
|
|
|
+
|
|
|
+```php
|
|
|
+// 修改前
|
|
|
+Route::resource('stats', StatController::class)->only(['index', 'show'])->names([
|
|
|
+ 'index' => 'admin.openapi.stats.index',
|
|
|
+ 'show' => 'admin.openapi.stats.show',
|
|
|
+]);
|
|
|
+
|
|
|
+// 修改后
|
|
|
+// 统计分析管理 - 使用Resource注解自动注册,无需手动定义
|
|
|
+```
|
|
|
+
|
|
|
+### 2. 注册AdminServiceProvider
|
|
|
+
|
|
|
+发现 `AdminServiceProvider` 没有在 `config/app.php` 中注册,导致 `admin.cache` 服务无法解析。
|
|
|
+
|
|
|
+在 `config/app.php` 中添加:
|
|
|
+
|
|
|
+```php
|
|
|
+// Admin 模块
|
|
|
+\App\Module\Admin\Providers\AdminServiceProvider::class,
|
|
|
+```
|
|
|
+
|
|
|
+### 3. 修复命令类问题
|
|
|
+
|
|
|
+`AdminServiceProvider` 中引用了不存在的命令类,暂时注释掉:
|
|
|
+
|
|
|
+```php
|
|
|
+protected function registerCommands()
|
|
|
+{
|
|
|
+ if ($this->app->runningInConsole()) {
|
|
|
+ // 暂时注释掉不存在的命令类
|
|
|
+ // $this->commands([
|
|
|
+ // \App\Module\Admin\Commands\AdminCacheCommand::class,
|
|
|
+ // \App\Module\Admin\Commands\AdminMaintenanceCommand::class,
|
|
|
+ // ]);
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+## 验证结果
|
|
|
+
|
|
|
+### 1. 路由缓存成功
|
|
|
+
|
|
|
+```bash
|
|
|
+$ php artisan route:cache
|
|
|
+INFO Routes cached successfully.
|
|
|
+```
|
|
|
+
|
|
|
+### 2. 路由正确注册
|
|
|
+
|
|
|
+```bash
|
|
|
+$ php artisan route:list --name=admin.openapi.stats
|
|
|
+
|
|
|
+GET|HEAD admin/openapi-stats admin.openapi.stats.index
|
|
|
+GET|HEAD admin/openapi-stats/{openapi_stat} admin.openapi.stats.show
|
|
|
+GET|HEAD admin/openapi/stats/chart-data admin.openapi.stats.chart_data
|
|
|
+GET|HEAD admin/openapi/stats/dashboard admin.openapi.stats.dashboard
|
|
|
+GET|HEAD admin/openapi/stats/export admin.openapi.stats.export
|
|
|
+POST admin/openapi/stats/generate admin.openapi.stats.generate
|
|
|
+```
|
|
|
+
|
|
|
+可以看到:
|
|
|
+- **Resource注解路由**: `admin/openapi-stats` (index/show)
|
|
|
+- **手动扩展路由**: `admin/openapi/stats/*` (dashboard/export等)
|
|
|
+
|
|
|
+## 技术要点
|
|
|
+
|
|
|
+### 1. 路由注册规范
|
|
|
+
|
|
|
+- 优先使用 `#[Resource]` 注解自动注册标准CRUD路由
|
|
|
+- 手动路由文件仅用于扩展路由(如dashboard、export等)
|
|
|
+- 避免同一路由名称的重复定义
|
|
|
+
|
|
|
+### 2. 服务提供者注册
|
|
|
+
|
|
|
+- 所有模块的 `ServiceProvider` 必须在 `config/app.php` 中注册
|
|
|
+- 确保依赖的服务能够正确解析
|
|
|
+
|
|
|
+### 3. 命令类管理
|
|
|
+
|
|
|
+- 服务提供者中引用的命令类必须存在
|
|
|
+- 不存在的命令类应该注释掉或创建对应的类
|
|
|
+
|
|
|
+## 文件修改清单
|
|
|
+
|
|
|
+1. `app/Module/OpenAPI/Routes/admin.php` - 删除重复路由定义
|
|
|
+2. `config/app.php` - 注册AdminServiceProvider
|
|
|
+3. `app/Module/Admin/Providers/AdminServiceProvider.php` - 注释不存在的命令类
|
|
|
+
|
|
|
+## 后续建议
|
|
|
+
|
|
|
+1. 创建缺失的命令类:
|
|
|
+ - `App\Module\Admin\Commands\AdminCacheCommand`
|
|
|
+ - `App\Module\Admin\Commands\AdminMaintenanceCommand`
|
|
|
+
|
|
|
+2. 建立路由注册规范文档,避免类似冲突
|
|
|
+
|
|
|
+3. 定期检查路由缓存,确保系统稳定性
|