PetLevelUpValidator.php 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. <?php
  2. namespace App\Module\Pet\Validators;
  3. use App\Module\Pet\Enums\PetStatus;
  4. use App\Module\Pet\Models\PetLevelConfig;
  5. use App\Module\Pet\Models\PetUser;
  6. use UCore\Validator;
  7. use UCore\Validator\ValidationMessage;
  8. /**
  9. * 宠物升级验证器
  10. *
  11. * 用于验证宠物升级条件的合法性
  12. */
  13. class PetLevelUpValidator extends Validator
  14. {
  15. use ValidationMessage;
  16. /**
  17. * 验证方法
  18. *
  19. * @param mixed $value 宠物ID
  20. * @param array $data 所有数据
  21. * @return bool 验证是否通过
  22. */
  23. public function validate(mixed $value, array $data): bool
  24. {
  25. $petId = $value;
  26. try {
  27. // 获取宠物信息
  28. $pet = PetUser::find($petId);
  29. if (!$pet) {
  30. $this->throwMessage([], '宠物不存在');
  31. return false;
  32. }
  33. // 检查宠物状态
  34. if ($pet->status !== PetStatus::NORMAL) {
  35. $this->throwMessage(['status' => $pet->status->value], '宠物当前状态({status})不允许升级');
  36. return false;
  37. }
  38. // 获取当前等级配置
  39. $currentLevelConfig = PetLevelConfig::where('level', $pet->level)->first();
  40. if (!$currentLevelConfig) {
  41. $this->throwMessage([], '宠物等级配置不存在');
  42. return false;
  43. }
  44. // 获取下一级配置
  45. $nextLevelConfig = PetLevelConfig::where('level', $pet->level + 1)->first();
  46. if (!$nextLevelConfig) {
  47. $this->throwMessage(['level' => $pet->level], '宠物已达到最大等级({level})');
  48. return false;
  49. }
  50. // 检查经验值是否足够
  51. if ($pet->experience < $nextLevelConfig->exp_required) {
  52. $this->throwMessage([
  53. 'current' => $pet->experience,
  54. 'required' => $nextLevelConfig->exp_required
  55. ], '经验值不足,无法升级,当前({current}),需要({required})');
  56. return false;
  57. }
  58. return true;
  59. } catch (\Exception $e) {
  60. $this->throwMessage(['error' => $e->getMessage()], '验证过程发生错误: {error}');
  61. return false;
  62. }
  63. }
  64. }