PetStatusTempDto.php 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. <?php
  2. namespace App\Module\Game\Dtos;
  3. use App\Module\Pet\Dtos\PetDataDto;
  4. use App\Module\Pet\Dtos\PetLifeSkillDto;
  5. /**
  6. * 宠物状态临时数据DTO
  7. *
  8. * 用于存储和传输宠物的完整数据
  9. * 继承自PetDataDto,包含宠物的完整数据
  10. * 适用于PetCreatedEvent和PetUpdateEvent事件的数据存储
  11. */
  12. class PetStatusTempDto extends PetDataDto
  13. {
  14. /**
  15. * 更新时间戳
  16. *
  17. * @var int
  18. */
  19. public int $updatedAt = 0;
  20. /**
  21. * 从缓存中恢复对象数组
  22. *
  23. * 重写父类方法以正确处理嵌套的PetLifeSkillDto对象数组
  24. *
  25. * @param mixed $cachedData 缓存的数据
  26. * @return array DTO对象数组
  27. */
  28. public static function fromCache($cachedData): array
  29. {
  30. if (is_null($cachedData)) {
  31. return [];
  32. }
  33. if (!is_array($cachedData)) {
  34. return [];
  35. }
  36. $result = [];
  37. foreach ($cachedData as $key => $item) {
  38. if ($item instanceof static) {
  39. // 如果已经是正确的对象类型,检查并修复lifeSkills
  40. self::fixLifeSkills($item);
  41. $result[$key] = $item;
  42. } elseif (is_array($item)) {
  43. // 从数组创建DTO对象
  44. $dto = new static();
  45. // 复制基本属性
  46. $dto->id = $item['id'] ?? 0;
  47. $dto->typeId = $item['type_id'] ?? $item['typeId'] ?? 0;
  48. $dto->name = $item['name'] ?? '';
  49. $dto->level = $item['level'] ?? 1;
  50. $dto->exp = $item['exp'] ?? 0;
  51. $dto->power = $item['power'] ?? 0;
  52. $dto->maxpower = $item['maxpower'] ?? 100;
  53. $dto->score = $item['score'] ?? 0;
  54. $dto->fightingCapacity = $item['fighting_capacity'] ?? $item['fightingCapacity'] ?? 0;
  55. $dto->grade = $item['grade'] ?? 0;
  56. $dto->status = $item['status'] ?? 1;
  57. $dto->updatedAt = $item['updated_at'] ?? $item['updatedAt'] ?? time();
  58. // 特殊处理lifeSkills数组,确保其中的元素是PetLifeSkillDto对象
  59. $lifeSkills = [];
  60. $skillsData = $item['life_skills'] ?? $item['lifeSkills'] ?? [];
  61. if (is_array($skillsData)) {
  62. foreach ($skillsData as $skillData) {
  63. if ($skillData instanceof PetLifeSkillDto) {
  64. $lifeSkills[] = $skillData;
  65. } elseif (is_array($skillData)) {
  66. $skillDto = new PetLifeSkillDto();
  67. $skillDto->skillId = $skillData['skill_id'] ?? $skillData['skillId'] ?? 0;
  68. $skillDto->canuse = $skillData['canuse'] ?? false;
  69. $skillDto->curnum = $skillData['curnum'] ?? 0;
  70. $skillDto->maxnum = $skillData['maxnum'] ?? 0;
  71. $lifeSkills[] = $skillDto;
  72. }
  73. }
  74. }
  75. $dto->lifeSkills = $lifeSkills;
  76. $result[$key] = $dto;
  77. }
  78. }
  79. return $result;
  80. }
  81. /**
  82. * 修复lifeSkills数组,确保其中的元素是PetLifeSkillDto对象
  83. *
  84. * @param PetStatusTempDto $dto
  85. * @return void
  86. */
  87. private static function fixLifeSkills(PetStatusTempDto $dto): void
  88. {
  89. if (!isset($dto->lifeSkills) || !is_array($dto->lifeSkills)) {
  90. $dto->lifeSkills = [];
  91. return;
  92. }
  93. $fixedSkills = [];
  94. foreach ($dto->lifeSkills as $skill) {
  95. if ($skill instanceof PetLifeSkillDto) {
  96. $fixedSkills[] = $skill;
  97. } elseif (is_array($skill)) {
  98. $skillDto = new PetLifeSkillDto();
  99. $skillDto->skillId = $skill['skill_id'] ?? $skill['skillId'] ?? 0;
  100. $skillDto->canuse = $skill['canuse'] ?? false;
  101. $skillDto->curnum = $skill['curnum'] ?? 0;
  102. $skillDto->maxnum = $skill['maxnum'] ?? 0;
  103. $fixedSkills[] = $skillDto;
  104. }
  105. }
  106. $dto->lifeSkills = $fixedSkills;
  107. }
  108. }