神像系统优化完成总结.md 5.5 KB

神像系统优化完成总结

优化概述

根据要求,我们对神像系统进行了两个主要优化:

  1. 为物品的 NumericAttributesCast 增加神像时间属性
  2. 优化 OpenHandler,参考 PesticideHandler 的实现方式

详细修改内容

1. NumericAttributesCast 增加神像时间属性

文件: app/Module/GameItems/Casts/NumericAttributesCast.php

新增属性:

/**
 * 神像时间(秒),用以标识该物品可以开启神像
 *
 * @var int $god_duration_seconds
 */
public int $god_duration_seconds = 0;

作用:

  • 标识物品是否为神像物品
  • 定义神像激活后的持续时间(以秒为单位)
  • 值为0表示不是神像物品,大于0表示是神像物品

2. 创建神像激活验证系统

2.1 验证类 (GodActivationValidation)

文件: app/Module/Farm/Validations/GodActivationValidation.php

功能:

  • 验证用户ID、神像ID和物品ID的有效性
  • 集成神像激活验证器进行业务逻辑验证

2.2 验证器 (GodActivationValidator)

文件: app/Module/Farm/Validators/GodActivationValidator.php

验证内容:

  • ✅ 神像类型是否有效(1-4)
  • ✅ 用户是否已有该神像的有效加持
  • ✅ 用户是否拥有神像物品
  • ✅ 物品是否具有神像时间属性

3. 优化 OpenHandler

文件: app/Module/AppGame/Handler/God/OpenHandler.php

3.1 参考 PesticideHandler 的优化结构

优化前的问题:

  • 所有验证逻辑都在 handle 方法中
  • 事务开启过早,验证失败时浪费资源
  • 错误处理不够细致

优化后的改进:

  • 验证前置: 在开启事务前进行所有验证
  • 分离关注点: 验证逻辑独立到 Validation 类
  • 细化异常处理: 区分验证异常、业务异常和系统异常
  • 智能物品查找: 自动查找具有神像时间属性的物品

3.2 新增功能

智能物品查找 (findGodItem 方法):

private function findGodItem(int $userId): int
{
    // 获取用户所有物品
    $userItems = ItemService::getUserItems($userId);

    foreach ($userItems as $userItem) {
        // 检查物品是否具有神像时间属性
        $godDuration = ItemService::getItemNumericAttribute($userItem->itemId, 'god_duration_seconds');
        
        if ($godDuration > 0) {
            return $userItem->itemId;
        }
    }

    throw new LogicException("您没有神像物品");
}

动态时间计算 (activateGodBuff 方法):

// 获取物品的神像时间属性
$godDurationSeconds = ItemService::getItemNumericAttribute($itemId, 'god_duration_seconds');
$durationHours = $godDurationSeconds > 0 ? ceil($godDurationSeconds / 3600) : 24; // 转换为小时,默认24小时

技术改进

1. 验证流程优化

优化前:

开启事务 → 验证 → 业务逻辑 → 提交/回滚

优化后:

验证 → 开启事务 → 业务逻辑 → 提交/回滚

2. 异常处理分层

异常类型 处理方式 HTTP状态码 说明
ValidateException 验证失败,无需回滚 400 参数验证失败
LogicException 业务异常,需要回滚 400 业务逻辑错误
Exception 系统异常,需要回滚 500 系统级错误

3. 物品识别机制

优化前: 硬编码物品ID映射

$godItemId = 3000 + $godId; // 假设神像物品ID为3001-3004

优化后: 基于属性的动态识别

// 检查物品是否具有神像时间属性
$godDuration = ItemService::getItemNumericAttribute($userItem->itemId, 'god_duration_seconds');
if ($godDuration > 0) {
    return $userItem->itemId; // 找到神像物品
}

使用示例

1. 配置神像物品

在物品配置中设置 numeric_attributes:

{
    "god_duration_seconds": 86400
}
  • 86400 = 24小时
  • 3600 = 1小时
  • 0 = 不是神像物品

2. 客户端调用

// 激活神像请求
{
    "god_id": 1  // 1=丰收之神, 2=雨露之神, 3=屠草之神, 4=拭虫之神
}

// 成功响应
{
    "code": 0,
    "msg": "神像激活成功",
    "last_data": {
        "gods": [
            {
                "id": 1,
                "status": true,
                "vaid_time": 1716537600  // 过期时间戳
            }
        ]
    }
}

测试覆盖

测试文件: tests/Unit/GodActivationTest.php

测试内容:

  • ✅ 神像时间属性测试
  • ✅ 神像激活验证测试
  • ✅ 神像类型枚举测试
  • ✅ 时间转换逻辑测试
  • ✅ 数值属性Cast类测试
  • ✅ 验证器错误消息测试

兼容性说明

1. 向后兼容

  • 现有的神像物品仍然可以正常使用
  • 如果物品没有 god_duration_seconds 属性,默认使用24小时

2. 扩展性

  • 可以为不同的神像物品设置不同的持续时间
  • 支持未来添加更多神像类型
  • 验证系统可以轻松扩展新的验证规则

性能优化

  1. 验证前置: 避免不必要的事务开销
  2. 智能查找: 只在需要时查找神像物品
  3. 缓存友好: 物品属性查询可以被缓存
  4. 异常分层: 减少不必要的回滚操作

总结

通过这次优化,神像系统变得更加:

  • 灵活: 支持动态配置神像持续时间
  • 健壮: 完善的验证和异常处理机制
  • 高效: 优化的验证流程和事务管理
  • 可维护: 清晰的代码结构和分离的关注点

这些改进为神像系统的未来扩展奠定了良好的基础,同时保持了与现有系统的兼容性。