09日1626-优化合成Validation逻辑移除旧版残留代码.md 5.5 KB

优化合成Validation逻辑,移除旧版残留代码

任务概述

优化合成系统的Validation逻辑,移除旧版合成系统的残留代码,统一使用组系统进行验证。

问题分析

1. CraftService中存在旧版逻辑残留

  • $canCraft['ValidateException'] 应该是 $canCraft['can_craft']
  • 使用了错误的Exception类型
  • 返回值处理不正确

2. ItemCraftValidation使用旧版验证逻辑

  • CraftMaterialsValidator 仍在使用旧的材料验证逻辑
  • 直接检查物品数量,未使用组系统
  • 验证逻辑与新的组系统不一致

3. 验证逻辑重复

  • Handler中的Validation和Service中的验证存在重复
  • 增加了不必要的性能开销

实施方案

1. 修复CraftService中的旧版逻辑残留

1.1 修复canCraftByUser方法调用

// 修复前
if (!$canCraft['ValidateException']) {
    throw new Exception($canCraft['reason']);
}

// 修复后
if (!$canCraft['can_craft']) {
    throw new ValidateException($canCraft['reason']);
}

1.2 修复返回值处理

// 修复消耗结果检查
if ($consumeResult->error) {
    throw new LogicException("消耗失败: " . $consumeResult->message);
}

// 修复奖励结果检查
if ($rewardResult->success) {
    $rewardItems = $rewardResult->items;
}

// 修复日志记录
'materials' => $consumeResult->data['consumed'] ?? [],

// 修复错误返回
return Res::error('合成失败: ' . $e->getMessage());

2. 创建基于组系统的新验证器

2.1 CraftConsumeValidator

文件: app/Module/GameItems/Validators/CraftConsumeValidator.php

  • 基于消耗组验证用户是否有足够的资源进行合成
  • 使用ConsumeService::checkConsume进行验证
  • 支持倍数参数,验证多倍消耗

    // 使用消耗组服务检查消耗条件
    $checkResult = ConsumeService::checkConsume($userId, $recipe->consume_group_id, $quantity);
    
    if (!$checkResult->success) {
    $this->addError($checkResult->message);
    return false;
    }
    

2.2 CraftConditionValidator

文件: app/Module/GameItems/Validators/CraftConditionValidator.php

  • 基于条件组验证用户是否满足合成条件
  • 使用ConditionService::checkCondition进行验证
  • 如果配方没有条件组,则直接通过验证

    // 使用条件组服务检查条件
    $checkResult = ConditionService::checkCondition($userId, $recipe->condition_group_id);
    
    if (!$checkResult['success']) {
    $this->addError($checkResult['message']);
    return false;
    }
    

3. 优化ItemCraftValidation

3.1 更新验证器引用

use App\Module\GameItems\Validators\CraftRecipeValidator;
use App\Module\GameItems\Validators\CraftConsumeValidator;
use App\Module\GameItems\Validators\CraftConditionValidator;

3.2 更新验证规则

// 验证配方是否存在且可用
[
    'recipe_id', new CraftRecipeValidator($this, ['recipe']),
    'msg' => '配方验证失败'
],
// 验证合成条件是否满足
[
    'recipe_id', new CraftConditionValidator($this, ['user_id', 'recipe']),
    'msg' => '合成条件不满足'
],
// 验证合成消耗是否充足
[
    'recipe_id', new CraftConsumeValidator($this, ['user_id', 'quantity', 'recipe']),
    'msg' => '合成消耗不足'
]

4. 简化CraftHandler验证逻辑

4.1 移除重复验证

// 移除前:完整的Validation验证
$validation = new ItemCraftValidation([...]);
$validation->validated();

// 简化后:基础参数验证
if ($recipeId <= 0) {
    throw new LogicException("配方ID无效");
}

4.2 移除不必要的引用

  • 移除ItemCraftValidation的引用
  • 依赖Service层进行完整验证

技术优势

1. 统一验证逻辑

  • 所有验证都基于组系统
  • 消除了旧版和新版验证逻辑的混合使用
  • 提高了代码的一致性

2. 减少重复验证

  • Handler层只进行基础参数验证
  • Service层进行完整的业务验证
  • 避免了验证逻辑的重复执行

3. 更好的错误处理

  • 统一使用Res对象进行错误处理
  • 提供更准确的错误信息
  • 改善了用户体验

4. 提高可维护性

  • 验证器职责单一,易于维护
  • 基于组系统,便于扩展
  • 代码结构更清晰

修改文件

  1. app/Module/GameItems/Services/CraftService.php

    • 修复canCraftByUser方法调用错误
    • 修复返回值处理逻辑
    • 统一异常处理
  2. app/Module/GameItems/Validations/ItemCraftValidation.php

    • 更新验证器引用
    • 使用新的基于组系统的验证器
    • 分离条件验证和消耗验证
  3. app/Module/GameItems/Validators/CraftConsumeValidator.php (新增)

    • 基于消耗组的验证器
    • 支持倍数参数
  4. app/Module/GameItems/Validators/CraftConditionValidator.php (新增)

    • 基于条件组的验证器
    • 处理可选条件组
  5. app/Module/AppGame/Handler/Item/CraftHandler.php

    • 简化验证逻辑
    • 移除重复验证
  6. app/Module/GameItems/Validators/CraftMaterialsValidator.php (删除)

    • 移除旧版材料验证器

测试建议

1. 功能测试

  • 测试正常合成流程
  • 测试材料不足的情况
  • 测试条件不满足的情况
  • 测试配方不存在的情况

2. 性能测试

  • 验证优化后的性能提升
  • 确认没有引入新的性能问题

3. 兼容性测试

  • 确认现有合成功能正常工作
  • 验证错误信息的准确性

总结

这次优化彻底移除了合成系统中旧版逻辑的残留,统一使用组系统进行验证,提高了代码的一致性、可维护性和性能。新的验证器设计更加模块化,便于后续的功能扩展和维护。