EnumController.php 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. <?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Http\JsonResponse;
  4. use Illuminate\Http\Request;
  5. use Illuminate\Support\Facades\Redis;
  6. /**
  7. * @group 通用接口
  8. */
  9. class EnumController extends Controller
  10. {
  11. /**
  12. * 获取枚举数据
  13. *
  14. * @queryParam enum string required 枚举类名称,例如:UserType,OrderStatus等 Example: UserType
  15. *
  16. * @response 200 {
  17. * "data": {
  18. * "items": [
  19. * {
  20. * "label": "普通用户",
  21. * "value": 1
  22. * },
  23. * {
  24. * "label": "VIP用户",
  25. * "value": 2
  26. * }
  27. * ],
  28. * "msg": "success",
  29. * "status": 200
  30. * }
  31. * }
  32. *
  33. * @response 400 {
  34. * "data": {
  35. * "items": [],
  36. * "msg": "枚举名称不能为空",
  37. * "status": 400
  38. * }
  39. * }
  40. *
  41. * @response 404 {
  42. * "data": {
  43. * "items": [],
  44. * "msg": "枚举类不存在",
  45. * "status": 404
  46. * }
  47. * }
  48. */
  49. public function getEnumData(Request $request): JsonResponse
  50. {
  51. $enumName = $request->input('enum');
  52. if (empty($enumName)) {
  53. return response()->json([
  54. 'data' => [
  55. 'items' => [],
  56. 'msg' => '枚举名称不能为空',
  57. 'status' => 400
  58. ]
  59. ]);
  60. }
  61. try {
  62. // 构造完整的枚举类名
  63. $enumClass = "App\\Enums\\{$enumName}";
  64. // 检查类是否存在
  65. if (!class_exists($enumClass)) {
  66. return response()->json([
  67. 'data' => [
  68. 'items' => [],
  69. 'msg' => "枚举类 {$enumName} 不存在",
  70. 'status' => 404
  71. ]
  72. ]);
  73. }
  74. // 从Redis缓存获取数据
  75. $cacheKey = "enum:{$enumName}";
  76. $enumData = Redis::get($cacheKey);
  77. if (!$enumData) {
  78. // 缓存不存在,获取枚举数据并转换格式
  79. $rawData = $enumClass::all();
  80. $items = [];
  81. foreach ($rawData as $value => $label) {
  82. $items[] = [
  83. 'label' => $label,
  84. 'value' => $value
  85. ];
  86. }
  87. // 存入Redis缓存,设置过期时间为1天
  88. Redis::setex($cacheKey, 86400, json_encode($items));
  89. } else {
  90. $items = json_decode($enumData, true);
  91. }
  92. return response()->json([
  93. 'data' => [
  94. 'items' => $items,
  95. 'msg' => '',
  96. 'status' => 0
  97. ]
  98. ]);
  99. } catch (\Throwable $e) {
  100. return response()->json([
  101. 'data' => [
  102. 'items' => [],
  103. 'msg' => $e->getMessage(),
  104. 'status' => 500
  105. ]
  106. ]);
  107. }
  108. }
  109. }