EnumController.php 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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. * "items": [
  18. * {
  19. * "label": "普通用户",
  20. * "value": 1
  21. * },
  22. * {
  23. * "label": "VIP用户",
  24. * "value": 2
  25. * }
  26. * ],
  27. * "message": "",
  28. * "code": 0
  29. * }
  30. *
  31. * @response 400 {
  32. * "items": [],
  33. * "message": "枚举名称不能为空",
  34. * "code": 400
  35. * }
  36. *
  37. * @response 404 {
  38. * "items": [],
  39. * "message": "枚举类不存在",
  40. * "code": 404
  41. * }
  42. */
  43. public function getEnumData(Request $request): JsonResponse
  44. {
  45. $enumName = $request->input('enum');
  46. if (empty($enumName)) {
  47. return response()->json([
  48. 'items' => [],
  49. 'message' => '枚举名称不能为空',
  50. 'code' => 400
  51. ]);
  52. }
  53. try {
  54. // 构造完整的枚举类名
  55. $enumClass = "App\\Enums\\{$enumName}";
  56. // 检查类是否存在
  57. if (!class_exists($enumClass)) {
  58. return response()->json([
  59. 'items' => [],
  60. 'message' => "枚举类 {$enumName} 不存在",
  61. 'code' => 404
  62. ]);
  63. }
  64. // 从Redis缓存获取数据
  65. $cacheKey = "enum:{$enumName}";
  66. $enumData = Redis::get($cacheKey);
  67. if (!$enumData) {
  68. // 缓存不存在,获取枚举数据并转换格式
  69. $rawData = $enumClass::all();
  70. $items = [];
  71. foreach ($rawData as $value => $label) {
  72. $items[] = [
  73. 'label' => $label,
  74. 'value' => $value
  75. ];
  76. }
  77. // 存入Redis缓存,设置过期时间为1天
  78. Redis::setex($cacheKey, 86400, json_encode($items));
  79. } else {
  80. $items = json_decode($enumData, true);
  81. }
  82. return response()->json([
  83. 'items' => $items,
  84. 'message' => '',
  85. 'code' => 0
  86. ]);
  87. } catch (\Throwable $e) {
  88. return response()->json([
  89. 'items' => [],
  90. 'message' => $e->getMessage(),
  91. 'code' => 500
  92. ]);
  93. }
  94. }
  95. }