# Kylin Modules 路由管理

## 1. 路由管理概述

Kylin Modules 支持模块的路由管理，每个模块可以有自己的路由文件，支持 web 路由和 API 路由。

## 2. 路由配置

### 2.1 模块路由配置

在模块的 `Routes` 目录中创建路由文件：

**web.php**：用于 web 路由

```php
<?php

use Illuminate\Support\Facades\Route;
use Modules\Blog\Controllers\BlogController;

Route::group(['prefix' => 'blog', 'namespace' => 'Modules\Blog\Controllers'], function () {
    Route::get('/', [BlogController::class, 'index'])->name('blog.index');
    Route::get('/create', [BlogController::class, 'create'])->name('blog.create');
    Route::post('/store', [BlogController::class, 'store'])->name('blog.store');
    Route::get('/{id}', [BlogController::class, 'show'])->name('blog.show');
    Route::get('/{id}/edit', [BlogController::class, 'edit'])->name('blog.edit');
    Route::put('/{id}', [BlogController::class, 'update'])->name('blog.update');
    Route::delete('/{id}', [BlogController::class, 'destroy'])->name('blog.destroy');
});
```

**api.php**：用于 API 路由

```php
<?php

use Illuminate\Support\Facades\Route;
use Modules\Blog\Controllers\Api\BlogApiController;

Route::group(['prefix' => 'api/blog', 'namespace' => 'Modules\Blog\Controllers\Api'], function () {
    Route::get('/', [BlogApiController::class, 'index'])->name('api.blog.index');
    Route::get('/{id}', [BlogApiController::class, 'show'])->name('api.blog.show');
    Route::post('/', [BlogApiController::class, 'store'])->name('api.blog.store');
    Route::put('/{id}', [BlogApiController::class, 'update'])->name('api.blog.update');
    Route::delete('/{id}', [BlogApiController::class, 'destroy'])->name('api.blog.destroy');
});
```

### 2.2 路由加载配置

在 `config/modules.php` 文件中配置路由加载：

```php
'routes' => [
    'enabled' => true,
    'path' => 'Routes',
    'files' => [
        'web',
        'api',
    ],
],
```

### 2.3 服务提供者中的路由加载

在模块的服务提供者中加载路由：

```php
public function boot()
{
    // 加载模块路由
    $this->loadRoutesFrom(__DIR__.'/../Routes/web.php');
    $this->loadRoutesFrom(__DIR__.'/../Routes/api.php');
}
```

## 3. 路由参数

### 3.1 路由前缀

为模块路由添加前缀，方便区分不同模块的路由：

```php
Route::group(['prefix' => 'blog'], function () {
    // 路由定义
});
```

### 3.2 路由命名空间

为模块路由指定命名空间，方便控制器的自动加载：

```php
Route::group(['namespace' => 'Modules\Blog\Controllers'], function () {
    // 路由定义
});
```

### 3.3 路由中间件

为模块路由添加中间件，实现权限控制等功能：

```php
Route::group(['middleware' => 'auth'], function () {
    // 路由定义
});
```

### 3.4 路由名称

为模块路由指定名称，方便生成 URL：

```php
Route::get('/', [BlogController::class, 'index'])->name('blog.index');
```

## 4. 路由生成

### 4.1 使用 route() 函数

使用 `route()` 函数生成模块路由的 URL：

```php
$url = route('blog.index');
$url = route('blog.show', ['id' => 1]);
```

### 4.2 使用 action() 函数

使用 `action()` 函数生成模块路由的 URL：

```php
$url = action([Modules\Blog\Controllers\BlogController::class, 'index']);
$url = action([Modules\Blog\Controllers\BlogController::class, 'show'], ['id' => 1]);
```

### 4.3 使用 URL 生成器

使用 URL 生成器生成模块路由的 URL：

```php
use Illuminate\Support\Facades\URL;

$url = URL::route('blog.index');
$url = URL::action([Modules\Blog\Controllers\BlogController::class, 'index']);
```

## 5. 路由缓存

### 5.1 生成路由缓存

为了提高性能，可以生成路由缓存：

```bash
php artisan route:cache
```

### 5.2 清除路由缓存

当路由发生变化时，需要清除路由缓存：

```bash
php artisan route:clear
```

## 6. 常见问题

### 6.1 路由未找到

**问题**：模块路由未找到
**解决方案**：
1. 检查模块是否已启用
2. 检查路由文件是否存在
3. 检查路由定义是否正确
4. 检查路由缓存是否已清除

### 6.2 路由冲突

**问题**：模块路由与其他路由冲突
**解决方案**：
1. 为模块路由添加唯一的前缀
2. 为模块路由指定唯一的名称
3. 检查路由定义是否正确

### 6.3 控制器未找到

**问题**：模块控制器未找到
**解决方案**：
1. 检查控制器文件是否存在
2. 检查控制器命名空间是否正确
3. 检查路由中的控制器引用是否正确

### 6.4 中间件未找到

**问题**：模块路由中间件未找到
**解决方案**：
1. 检查中间件是否存在
2. 检查中间件配置是否正确
3. 检查路由中的中间件引用是否正确

## 7. 最佳实践

1. **路由组织**：为每个模块创建独立的路由文件
2. **路由前缀**：为模块路由添加唯一的前缀
3. **路由命名**：为模块路由指定唯一的名称
4. **中间件使用**：合理使用中间件，实现权限控制
5. **路由缓存**：在生产环境中使用路由缓存，提高性能
6. **路由文档**：为模块路由编写文档，方便其他开发者使用

## 8. 总结

Kylin Modules 提供了灵活的路由管理功能，支持模块的路由配置和自动加载。通过合理的路由配置，可以实现模块的功能隔离和权限控制，提高代码的可维护性和安全性。
