|
|
6 tháng trước cách đây | |
|---|---|---|
| .. | ||
| AdminControllers | 7 tháng trước cách đây | |
| Commands | 6 tháng trước cách đây | |
| Config | 7 tháng trước cách đây | |
| Databases | 6 tháng trước cách đây | |
| Enums | 7 tháng trước cách đây | |
| Events | 7 tháng trước cách đây | |
| Exceptions | 7 tháng trước cách đây | |
| Jobs | 6 tháng trước cách đây | |
| Listeners | 7 tháng trước cách đây | |
| Models | 7 tháng trước cách đây | |
| Providers | 6 tháng trước cách đây | |
| Queues | 7 tháng trước cách đây | |
| Repositorys | 7 tháng trước cách đây | |
| Services | 7 tháng trước cách đây | |
| Tests | 7 tháng trước cách đây | |
| Validations | 7 tháng trước cách đây | |
| Validators | 7 tháng trước cách đây | |
| DEV.md | 7 tháng trước cách đây | |
| README.md | 6 tháng trước cách đây | |
示例模块 - 展示模块化开发的最佳实践和标准架构
Test模块是一个标准的示例模块,用于展示项目中模块化开发的最佳实践。它提供了完整的模块架构参考,包括数据层、业务逻辑层、服务层、控制器层等各个层次的标准实现方式。
app/Module/Test/
├── AdminControllers/ # 后台管理控制器
│ ├── Helper/ # 控制器辅助类
│ │ ├── TestGridHelper.php # 表格辅助类
│ │ ├── TestFormHelper.php # 表单辅助类
│ │ └── TestFilterHelper.php # 筛选辅助类
│ ├── Actions/ # 控制器动作类
│ │ └── TestExportAction.php # 导出动作
│ └── TestController.php # 主控制器
├── Commands/ # 命令行工具
│ └── TestCommand.php # 示例命令
├── Config/ # 配置文件
│ └── test.php # 模块配置
├── Casts/ # 自定义类型转换器
│ └── TestAttributesCast.php # 测试属性转换器
├── Databases/ # 数据库相关
│ └── create.sql # 数据库创建脚本
├── Docs/ # 文档目录
│ ├── README.md # 模块文档索引
│ ├── 设计文档.md # 设计文档
│ └── 开发指南.md # 开发指南
├── Dtos/ # 数据传输对象
│ └── TestDto.php # 测试DTO
├── Enums/ # 枚举类型定义
│ ├── TEST_STATUS.php # 状态枚举
│ └── TEST_TYPE.php # 类型枚举
├── Events/ # 事件类
│ └── TestCreatedEvent.php # 测试创建事件
├── Exceptions/ # 自定义异常
│ └── TestException.php # 测试异常
├── Listeners/ # 事件监听器
│ └── TestCreatedListener.php # 测试创建监听器
├── Logics/ # 业务逻辑类(内部使用)
│ └── Test.php # 测试逻辑
├── Models/ # 数据模型
│ ├── TestItem.php # 测试项目模型
│ └── TestLog.php # 测试日志模型
├── Providers/ # 服务提供者
│ └── TestServiceProvider.php # 测试服务提供者
├── Repositorys/ # 数据仓库(后台专用)
│ └── TestRepository.php # 测试仓库
├── Services/ # 服务类(对外接口)
│ └── TestService.php # 测试服务
├── Validations/ # 验证类(业务验证)
│ └── TestCreateValidation.php # 创建验证
├── Validators/ # 验证器(单一验证逻辑)
│ └── TestStatusValidator.php # 状态验证器
└── Tests/ # 测试目录
├── TestServiceTest.php # 服务测试
└── test_manual.php # 手动测试脚本
| 目录 | 用途 | 说明 |
|---|---|---|
| AdminControllers/ | 后台管理界面 | 继承自UCore\DcatAdmin\AdminController |
| Commands/ | 命令行工具 | 定时任务、数据处理等命令 |
| Casts/ | 自定义类型转换器 | 处理JSON属性等特殊字段 |
| Config/ | 配置文件 | 模块相关配置参数 |
| Databases/ | 数据库相关 | SQL创建脚本 |
| Docs/ | 文档目录 | 模块设计和开发文档 |
| Dtos/ | 数据传输对象 | 继承自UCore\Dto\BaseDto |
| Enums/ | 枚举定义 | 使用PHP enum语法,避免魔法数字 |
| Events/ | 事件类 | 模块间通信事件 |
| Exceptions/ | 自定义异常 | 业务异常处理 |
| Listeners/ | 事件监听器 | 处理事件响应 |
| Logics/ | 业务逻辑 | 内部业务处理,不对外暴露 |
| Models/ | 数据模型 | 继承自UCore\ModelCore,无业务逻辑 |
| Providers/ | 服务提供者 | 注册服务和事件 |
| Repositorys/ | 数据仓库 | 封装数据库操作,仅供后台管理使用 |
| Services/ | 服务接口 | 对外提供功能,调用Logics层 |
| Validations/ | 验证类 | 复合验证逻辑 |
| Validators/ | 验证器 | 单一验证逻辑 |
| Tests/ | 测试文件 | 单元测试和手动测试 |
Test模块采用标准的分层架构设计:
┌─────────────────┐
│ Controllers │ ← HTTP请求处理(非对外模块不提供)
├─────────────────┤
│ Services │ ← 对外服务接口
├─────────────────┤
│ Logics │ ← 内部业务逻辑
├─────────────────┤
│ Models │ ← 数据模型层
└─────────────────┘
\UCore\ModelCore,如TestItemService结尾,如TestServiceTestValidation结尾,如TestCreateValidationValidator结尾,如TestStatusValidatorTEST_STATUSDto结尾,如TestDtotest_(物品模块item_,宠物模块pet_)kku_前缀(在config/database.php中全局配置)kku_test_items、kku_test_logsApp\Module\TestApp\Module\AppGame\Handler(接口层,专门的对外接口模块)<?php
namespace App\Module\Test\Models;
use UCore\ModelCore;
/**
* 测试项目模型
*
* 设计原则:
* - 继承自\UCore\ModelCore,保持无业务逻辑
* - 不设置$prefix属性(全局配置在config/database.php)
* - 在模型中定义访问器而非控制器中实现逻辑
* - 为模型创建独立Cast类,不同模型不共用Cast类
*
* field start
* @property int $id 主键ID
* @property string $name 项目名称
* @property int $status 状态
* @property \Carbon\Carbon $created_at 创建时间
* @property \Carbon\Carbon $updated_at 更新时间
* field end
*/
class TestItem extends ModelCore
{
// attrlist start
protected $fillable = [
'name',
'status',
];
// attrlist end
/**
* 状态访问器 - 获取状态名称
*/
public function getStatusNameAttribute(): string
{
return TEST_STATUS::getName($this->status);
}
}
<?php
namespace App\Module\Test\Services;
use App\Module\Test\Dtos\TestDto;
use App\Module\Test\Logics\Test as TestLogic;
/**
* 测试服务类
*
* 设计原则:
* - 对外Service使用静态方法,内部Logic类处理业务逻辑
* - 服务层直接使用逻辑层和模型,不使用Repositorys
* - 模块间通过Service层交互,不直接访问其他模块模型
* - 服务层返回DTO对象而非Model
*/
class TestService
{
/**
* 创建测试项目
*
* @param array $data 项目数据
* @return TestDto
*/
public static function createTest(array $data): TestDto
{
$result = TestLogic::createTest($data);
return TestDto::fromModel($result);
}
/**
* 获取测试项目列表
*
* @param array $filters 筛选条件
* @return array
*/
public static function getTestList(array $filters = []): array
{
return TestLogic::getTestList($filters);
}
}
<?php
namespace App\Module\Test\Enums;
/**
* 测试状态枚举
*/
enum TEST_STATUS: int
{
case PENDING = 1; // 待处理
case PROCESSING = 2; // 处理中
case COMPLETED = 3; // 已完成
case FAILED = 4; // 失败
/**
* 获取状态名称
*/
public function getName(): string
{
return match ($this) {
self::PENDING => '待处理',
self::PROCESSING => '处理中',
self::COMPLETED => '已完成',
self::FAILED => '失败',
};
}
/**
* 获取所有状态
*/
public static function getAll(): array
{
return [
self::PENDING->value => self::PENDING->getName(),
self::PROCESSING->value => self::PROCESSING->getName(),
self::COMPLETED->value => self::COMPLETED->getName(),
self::FAILED->value => self::FAILED->getName(),
];
}
}
@docs/Validation使用示例.md
<?php
namespace App\Module\Test\Validations;
use UCore\Validation\ValidationCore;
/**
* 测试创建验证类
*
* 设计原则:
* - 使用Validation和Validator类处理验证逻辑,参考GodActivationValidation模式
* - 禁止动态属性赋值,需先定义属性并声明类型
*/
class TestCreateValidation extends ValidationCore
{
public function rules($rules = []): array
{
return [
['name', 'required'],
['name', 'string', 'max' => 255],
['status', 'integer', 'min' => 1],
];
}
public function default(): array
{
return [
'status' => TEST_STATUS::PENDING->value,
];
}
}
<?php
namespace App\Module\Test\Validators;
use UCore\Validation\ValidatorCore;
/**
* 测试状态验证器
*
* 设计原则:
* - 实现单一验证逻辑,使用addError方法而非throwMessage
* - 字段Key使用$arg参数传入,不直接硬编码
*/
class TestStatusValidator extends ValidatorCore
{
public function validate($value, $arg = null): bool
{
if (!in_array($value, array_keys(TEST_STATUS::getAll()))) {
$this->addError($arg, '状态值无效');
return false;
}
return true;
}
}
-- 测试项目表
CREATE TABLE `kku_test_items` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`name` varchar(255) NOT NULL COMMENT '项目名称',
`description` text COMMENT '项目描述',
`status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:1待处理,2处理中,3已完成,4失败',
`config` json DEFAULT NULL COMMENT '配置信息',
`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_status` (`status`),
KEY `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='测试项目表';
-- 测试日志表
CREATE TABLE `kku_test_logs` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '日志ID',
`test_id` int NOT NULL COMMENT '测试项目ID',
`action` varchar(100) NOT NULL COMMENT '操作类型',
`message` text COMMENT '日志消息',
`data` json DEFAULT NULL COMMENT '相关数据',
`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `idx_test_id` (`test_id`),
KEY `idx_action` (`action`),
KEY `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='测试日志表';
<?php
namespace App\Module\Test\Events;
use App\Module\Test\Models\TestItem;
use Illuminate\Foundation\Events\Dispatchable;
/**
* 测试创建事件
*/
class TestCreatedEvent
{
use Dispatchable;
public TestItem $testItem;
public function __construct(TestItem $testItem)
{
$this->testItem = $testItem;
}
}
<?php
namespace App\Module\Test\Listeners;
use App\Module\Test\Events\TestCreatedEvent;
/**
* 测试创建监听器
*/
class TestCreatedListener
{
public function handle(TestCreatedEvent $event): void
{
// 处理测试创建后的逻辑
// 如:发送通知、更新统计等
}
}
<?php
namespace App\Module\Test\AdminControllers;
use App\Module\Test\AdminControllers\Helper\TestGridHelper;
use App\Module\Test\AdminControllers\Helper\TestFormHelper;
use App\Module\Test\Repositorys\TestRepository;
use UCore\DcatAdmin\AdminController;
/**
* 测试后台控制器
*
* 设计原则:
* - 继承自UCore\DcatAdmin\AdminController
* - 使用Grid/Show/Form的'make'方法实例化
* - 使用GridHelper/ShowHelper/FormHelper/FilterHelper辅助类
* - Repositorys类参考Fund模块实现,内部不包含方法,仅供后台管理数据访问
* - 添加路由注释,加入后台菜单适当位置
*
* @route /admin/test-items
*/
class TestController extends AdminController
{
protected string $title = '测试管理';
protected string $repository = TestRepository::class;
protected function grid()
{
return TestGridHelper::make($this->repository());
}
protected function form()
{
return TestFormHelper::make();
}
}
<?php
namespace App\Module\Test\Dtos;
use UCore\Dto\BaseDto;
use App\Module\Test\Models\TestItem;
/**
* 测试DTO类
*
* 设计原则:
* - 继承自UCore\Dto\BaseDto
* - 实现fromModel静态方法
* - 使用驼峰命名公共属性
* - 服务层返回DTO对象而非Model
*/
class TestDto extends BaseDto
{
public int $id;
public string $name;
public int $status;
public string $statusName;
public string $createdAt;
public string $updatedAt;
/**
* 从模型创建DTO
*/
public static function fromModel(TestItem $model): self
{
$dto = new self();
$dto->id = $model->id;
$dto->name = $model->name;
$dto->status = $model->status;
$dto->statusName = $model->status_name;
$dto->createdAt = $model->created_at->toDateTimeString();
$dto->updatedAt = $model->updated_at->toDateTimeString();
return $dto;
}
}
<?php
namespace App\Module\AppGame\Handler;
use App\Module\Test\Services\TestService;
use App\Module\Test\Validations\TestCreateValidation;
use UCore\Handler\HandlerCore;
/**
* 测试Handler类
*
* 设计原则:
* - 参考PesticideHandler模式:先验证再执行操作
* - 不设置异常处理,继续抛出异常交由框架处理
* - 成功时使用RESPONSE_CODE常量设置响应码,不使用魔法数字0
* - Handler中将DTO转换为protobuf格式
* - 动作型方法使用Res对象处理返回值,不直接返回数组
*/
class TestHandler extends HandlerCore
{
/**
* 创建测试项目
*/
public function createTest($request)
{
// 验证请求数据
$validation = new TestCreateValidation();
$data = $validation->check($request);
// 执行业务逻辑
$result = TestService::createTest($data);
// 返回响应
return $this->success([
'test' => $this->convertToProtobuf($result)
]);
}
/**
* 转换DTO为protobuf格式
*/
private function convertToProtobuf($dto): array
{
return [
'id' => $dto->id,
'name' => $dto->name,
'status' => $dto->status,
'status_name' => $dto->statusName,
'created_at' => $dto->createdAt,
'updated_at' => $dto->updatedAt,
];
}
}
<?php
namespace App\Module\Test\Tests;
use App\Module\Test\Services\TestService;
use PHPUnit\Framework\TestCase;
/**
* 测试服务单元测试
*/
class TestServiceTest extends TestCase
{
public function testCreateTest()
{
$data = [
'name' => '测试项目',
'description' => '这是一个测试项目',
];
$result = TestService::createTest($data);
$this->assertNotNull($result);
$this->assertEquals($data['name'], $result->name);
}
}
<?php
// app/Module/Test/Tests/test_manual.php
require_once __DIR__ . '/../../../../bootstrap/app.php';
use App\Module\Test\Services\TestService;
// 测试创建功能
$data = [
'name' => '手动测试项目',
'description' => '手动测试描述',
];
try {
$result = TestService::createTest($data);
echo "创建成功:" . json_encode($result, JSON_UNESCAPED_UNICODE) . "\n";
} catch (Exception $e) {
echo "创建失败:" . $e->getMessage() . "\n";
}
Test模块可以参考GameItems模块的以下设计:
Test模块可以参考Mex模块的以下设计:
Test模块可以参考Farm模块的以下设计:
git status,提交代码并Push,使用中文CommitMessagephp artisan debug:reproduce-error命令回放错误请求最后更新时间:2025年06月16日 文档版本:v1.0 维护人员:开发团队 ```