EnumController.php 3.1 KB

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