EnumController.php 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  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. 'items' => [],
  55. 'msg' => '枚举名称不能为空',
  56. 'code' => 400
  57. ]);
  58. }
  59. try {
  60. // 构造完整的枚举类名
  61. $enumClass = "App\\Enums\\{$enumName}";
  62. // 检查类是否存在
  63. if (!class_exists($enumClass)) {
  64. return response()->json([
  65. 'items' => [],
  66. 'msg' => "枚举类 {$enumName} 不存在",
  67. 'code' => 404
  68. ]);
  69. }
  70. // 从Redis缓存获取数据
  71. $cacheKey = "enum:{$enumName}";
  72. $enumData = Redis::get($cacheKey);
  73. if (!$enumData) {
  74. // 缓存不存在,获取枚举数据并转换格式
  75. $rawData = $enumClass::all();
  76. $items = [];
  77. foreach ($rawData as $value => $label) {
  78. $items[] = [
  79. 'label' => $label,
  80. 'value' => $value
  81. ];
  82. }
  83. // 存入Redis缓存,设置过期时间为1天
  84. Redis::setex($cacheKey, 86400, json_encode($items));
  85. } else {
  86. $items = json_decode($enumData, true);
  87. }
  88. return response()->json([
  89. 'items' => $items,
  90. 'msg' => '',
  91. 'code' => 0
  92. ]);
  93. } catch (\Throwable $e) {
  94. return response()->json([
  95. 'items' => [],
  96. 'msg' => $e->getMessage(),
  97. 'code' => 500
  98. ]);
  99. }
  100. }
  101. }