# Kylin Modules 控制器管理

## 1. 控制器管理概述

Kylin Modules 支持模块的控制器管理，每个模块可以有自己的控制器，用于处理 HTTP 请求和响应。

## 2. 控制器创建

### 2.1 基本控制器

在模块的 `Controllers` 目录中创建控制器：

```php
<?php

namespace Modules\Blog\Controllers;

use Illuminate\Http\Request;
use Illuminate\Routing\Controller;

class BlogController extends Controller
{
    /**
     * 显示博客列表
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        return view('blog::index');
    }

    /**
     * 显示创建博客表单
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        return view('blog::create');
    }

    /**
     * 存储新博客
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        // 验证请求数据
        $request->validate([
            'title' => 'required|string|max:255',
            'content' => 'required|string',
        ]);

        // 存储博客
        // ...

        return redirect()->route('blog.index')->with('success', '博客创建成功');
    }

    /**
     * 显示博客详情
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        // 获取博客
        // ...

        return view('blog::show', compact('blog'));
    }

    /**
     * 显示编辑博客表单
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        // 获取博客
        // ...

        return view('blog::edit', compact('blog'));
    }

    /**
     * 更新博客
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        // 验证请求数据
        $request->validate([
            'title' => 'required|string|max:255',
            'content' => 'required|string',
        ]);

        // 更新博客
        // ...

        return redirect()->route('blog.index')->with('success', '博客更新成功');
    }

    /**
     * 删除博客
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        // 删除博客
        // ...

        return redirect()->route('blog.index')->with('success', '博客删除成功');
    }
}
```

### 2.2 API 控制器

在模块的 `Controllers/Api` 目录中创建 API 控制器：

```php
<?php

namespace Modules\Blog\Controllers\Api;

use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Modules\Blog\Models\Post;

class BlogApiController extends Controller
{
    /**
     * 显示博客列表
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $posts = Post::all();
        return response()->json($posts);
    }

    /**
     * 显示博客详情
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        $post = Post::findOrFail($id);
        return response()->json($post);
    }

    /**
     * 存储新博客
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        // 验证请求数据
        $request->validate([
            'title' => 'required|string|max:255',
            'content' => 'required|string',
        ]);

        // 存储博客
        $post = Post::create($request->all());

        return response()->json($post, 201);
    }

    /**
     * 更新博客
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        // 验证请求数据
        $request->validate([
            'title' => 'required|string|max:255',
            'content' => 'required|string',
        ]);

        // 更新博客
        $post = Post::findOrFail($id);
        $post->update($request->all());

        return response()->json($post);
    }

    /**
     * 删除博客
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        // 删除博客
        $post = Post::findOrFail($id);
        $post->delete();

        return response()->json(null, 204);
    }
}
```

## 3. 控制器命名空间

### 3.1 命名空间配置

在 `config/modules.php` 文件中配置模块的命名空间：

```php
'namespace' => env('MODULES_NAMESPACE', 'Modules'),
```

### 3.2 控制器命名空间

模块控制器的命名空间格式为：`Modules\{ModuleName}\Controllers`

例如，Blog 模块的控制器命名空间为：`Modules\Blog\Controllers`

## 4. 控制器依赖注入

### 4.1 构造函数注入

在控制器的构造函数中注入依赖：

```php
<?php

namespace Modules\Blog\Controllers;

use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Modules\Blog\Services\PostService;

class BlogController extends Controller
{
    protected $postService;

    public function __construct(PostService $postService)
    {
        $this->postService = $postService;
    }

    public function index()
    {
        $posts = $this->postService->getAll();
        return view('blog::index', compact('posts'));
    }
}
```

### 4.2 方法注入

在控制器的方法中注入依赖：

```php
<?php

namespace Modules\Blog\Controllers;

use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Modules\Blog\Services\PostService;

class BlogController extends Controller
{
    public function index(PostService $postService)
    {
        $posts = $postService->getAll();
        return view('blog::index', compact('posts'));
    }
}
```

## 5. 控制器中间件

### 5.1 全局中间件

在 `app/Http/Kernel.php` 文件中注册全局中间件：

```php
protected $middleware = [
    // 全局中间件
];
```

### 5.2 路由中间件

在 `app/Http/Kernel.php` 文件中注册路由中间件：

```php
protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'admin' => \Modules\Blog\Http\Middleware\Admin::class,
];
```

### 5.3 控制器中间件

在控制器中使用中间件：

```php
<?php

namespace Modules\Blog\Controllers;

use Illuminate\Http\Request;
use Illuminate\Routing\Controller;

class BlogController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth')->except(['index', 'show']);
        $this->middleware('admin')->only(['create', 'store', 'edit', 'update', 'destroy']);
    }
}
```

## 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. **方法组织**：遵循 RESTful 设计原则，组织控制器方法
4. **依赖注入**：使用依赖注入，提高代码的可测试性
5. **中间件使用**：合理使用中间件，实现权限控制
6. **请求验证**：在控制器中验证请求数据，确保数据的合法性
7. **响应格式**：统一响应格式，提高 API 的一致性

## 8. 总结

Kylin Modules 提供了灵活的控制器管理功能，支持模块的控制器创建和自动加载。通过合理的控制器设计，可以实现业务逻辑的分离和代码的可维护性，提高开发效率和代码质量。
