Request机制重构说明.md 6.3 KB

URS Request机制重构说明

重构概述

本次重构将URS包的Request机制从"一个类处理多种请求"改为"一个Request类只完成一种请求"的设计原则,提高了代码的可维护性和扩展性。

重构前的问题

1. 违反单一职责原则

原有的UrsRequest类使用switch语句处理多种操作:

protected function handler(array $params): array
{
    $action = $params['action'] ?? '';

    switch ($action) {
        case 'register':
            return $this->handleRegister($params);
        case 'deposit':
            return $this->handleDeposit($params);
        case 'withdraw':
            return $this->handleWithdraw($params);
        case 'check':
            return $this->handleCheck($params);
        default:
            throw new \Exception("不支持的操作类型: {$action}");
    }
}

2. 代码耦合度高

  • 所有操作的逻辑都在同一个类中
  • 修改某个功能可能影响其他功能
  • 代码复杂度随着功能增加而快速增长

3. 难以维护和扩展

  • 新增功能需要修改现有类
  • 测试困难,需要测试所有功能
  • 代码职责不清晰

重构后的设计

1. 专用Request类

每个API操作都有对应的专用Request类:

获取用户信息

class UrsGetUserInfoRequest extends BaseRequest
{
    protected function handler(array $params): array
    {
        // 只处理获取用户信息的逻辑
        // 验证userKey参数
        // 调用URS API
        // 返回用户信息
    }
}

获取用户团队关系

class UrsGetUserTeamRequest extends BaseRequest
{
    protected function handler(array $params): array
    {
        // 只处理获取用户团队关系的逻辑
        // 验证userId参数
        // 调用URS API
        // 返回团队关系数据
    }
}

获取用户下级统计

class UrsGetUserLevelCountRequest extends BaseRequest
{
    protected function handler(array $params): array
    {
        // 只处理获取用户下级统计的逻辑
        // 验证userId和level参数
        // 调用URS API
        // 返回统计数据
    }
}

用户注册

class UrsRegisterRequest extends BaseRequest
{
    protected function handler(array $params): array
    {
        // 只处理用户注册的逻辑
        // 验证user_id和username参数
        // 调用URS API
        // 返回注册结果
    }
}

充值操作

class UrsDepositRequest extends BaseRequest
{
    protected function handler(array $params): array
    {
        // 只处理充值操作的逻辑
        // 验证user_id、amount、order_id参数
        // 调用URS API
        // 返回充值结果
    }
}

提取操作

class UrsWithdrawRequest extends BaseRequest
{
    protected function handler(array $params): array
    {
        // 只处理提取操作的逻辑
        // 验证user_id、amount、order_id参数
        // 调用URS API
        // 返回提取结果
    }
}

余额检查

class UrsCheckBalanceRequest extends BaseRequest
{
    protected function handler(array $params): array
    {
        // 只处理余额检查的逻辑
        // 验证user_id参数
        // 调用URS API
        // 返回余额信息
    }
}

2. 统一服务类

创建UrsService类来统一管理所有Request类的调用:

class UrsService
{
    public static function getUserInfo(string $userKey): array
    {
        $request = new UrsGetUserInfoRequest();
        return $request->request(['userKey' => $userKey]);
    }

    public static function getUserTeam(int $userId): array
    {
        $request = new UrsGetUserTeamRequest();
        return $request->request(['userId' => $userId]);
    }

    public static function getUserLevelCount(int $userId, int $level): array
    {
        $request = new UrsGetUserLevelCountRequest();
        return $request->request(['userId' => $userId, 'level' => $level]);
    }

    // ... 其他方法
}

重构后的优势

1. 单一职责原则

  • 每个Request类只负责一种特定的请求处理
  • 代码职责清晰,易于理解

2. 易于维护

  • 修改某个功能不会影响其他功能
  • 代码隔离性好,降低了维护风险

3. 易于扩展

  • 新增功能只需创建新的Request类
  • 不需要修改现有代码

4. 易于测试

  • 每个Request类可以独立测试
  • 测试覆盖率更高,测试更精确

5. 代码复用

  • 通用逻辑可以在基类中实现
  • 特定逻辑在各自的类中实现

文件结构对比

重构前

Request/
└── UrsRequest.php          # 处理所有操作的单一类

重构后

Request/
├── UrsGetUserInfoRequest.php       # 获取用户信息
├── UrsGetUserTeamRequest.php       # 获取用户团队关系
├── UrsGetUserLevelCountRequest.php # 获取用户下级统计
├── UrsRegisterRequest.php          # 用户注册
├── UrsDepositRequest.php           # 充值操作
├── UrsWithdrawRequest.php          # 提取操作
└── UrsCheckBalanceRequest.php      # 余额检查

Services/
└── UrsService.php                  # 统一服务类

使用方式对比

重构前

$request = new UrsRequest();
$result = $request->request([
    'action' => 'userInfo',
    'userKey' => 'user_key_here'
]);

重构后

// 方式一:直接使用Request类
$request = new UrsGetUserInfoRequest();
$result = $request->request(['userKey' => 'user_key_here']);

// 方式二:使用统一服务类(推荐)
$result = UrsService::getUserInfo('user_key_here');

兼容性说明

本次重构是破坏性更新,不兼容旧的调用方式。如果有现有代码使用了旧的UrsRequest类,需要按照新的方式进行调整。

测试验证

已创建TestUrsRequestCommand命令来验证重构后的功能:

# 测试所有Request类
php artisan thirdparty:test-urs-request

# 测试特定类型
php artisan thirdparty:test-urs-request --type=userinfo
php artisan thirdparty:test-urs-request --type=team
php artisan thirdparty:test-urs-request --type=count
php artisan thirdparty:test-urs-request --type=register

总结

本次重构显著提高了URS包的代码质量和可维护性,为后续的功能扩展奠定了良好的基础。建议其他第三方包也采用类似的设计原则进行开发。