ArticleCategoryService.php 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. <?php
  2. namespace App\Module\Article\Services;
  3. use App\Module\Article\Enums\STATUS;
  4. use App\Module\Article\Logics\ArticleCategoryLogic;
  5. use App\Module\Article\Models\ArticleCate;
  6. use Illuminate\Support\Collection;
  7. use Illuminate\Support\Facades\Cache;
  8. /**
  9. * 文章分类服务类
  10. *
  11. * 提供文章分类相关的服务方法,供其他模块调用
  12. */
  13. class ArticleCategoryService
  14. {
  15. /**
  16. * 获取所有分类
  17. *
  18. * @param bool $onlyActive 是否只获取激活状态的分类
  19. * @return Collection
  20. */
  21. public static function getAllCategories(bool $onlyActive = true): Collection
  22. {
  23. $cacheKey = 'article_categories_' . ($onlyActive ? 'active' : 'all');
  24. return Cache::remember($cacheKey, 3600, function () use ($onlyActive) {
  25. $query = ArticleCate::query();
  26. if ($onlyActive) {
  27. $query->where('status', STATUS::SHOW->value);
  28. }
  29. return $query->orderBy('sort_order', 'asc')->get();
  30. });
  31. }
  32. /**
  33. * 获取分类树
  34. *
  35. * @param bool $onlyActive 是否只获取激活状态的分类
  36. * @return array
  37. */
  38. public static function getCategoryTree(bool $onlyActive = true): array
  39. {
  40. $cacheKey = 'article_category_tree_' . ($onlyActive ? 'active' : 'all');
  41. return Cache::remember($cacheKey, 3600, function () use ($onlyActive) {
  42. $categories = self::getAllCategories($onlyActive);
  43. return self::buildCategoryTree($categories);
  44. });
  45. }
  46. /**
  47. * 构建分类树
  48. *
  49. * @param Collection $categories 分类集合
  50. * @param int $parentId 父级ID
  51. * @return array
  52. */
  53. protected static function buildCategoryTree(Collection $categories, int $parentId = 0): array
  54. {
  55. $tree = [];
  56. foreach ($categories as $category) {
  57. if ($category->pid == $parentId) {
  58. $children = self::buildCategoryTree($categories, $category->id);
  59. if ($children) {
  60. $category->children = $children;
  61. }
  62. $tree[] = $category;
  63. }
  64. }
  65. return $tree;
  66. }
  67. /**
  68. * 获取分类详情
  69. *
  70. * @param int $id 分类ID
  71. * @return ArticleCate|null
  72. */
  73. public static function getCategoryDetail(int $id): ?ArticleCate
  74. {
  75. return ArticleCate::find($id);
  76. }
  77. /**
  78. * 根据标识获取分类
  79. *
  80. * @param string $unid 分类标识
  81. * @return ArticleCate|null
  82. */
  83. public static function getCategoryByUnid(string $unid): ?ArticleCate
  84. {
  85. return ArticleCate::where('unid', $unid)->first();
  86. }
  87. /**
  88. * 创建分类
  89. *
  90. * @param array $data 分类数据
  91. * @return ArticleCate
  92. */
  93. public static function createCategory(array $data): ArticleCate
  94. {
  95. $category = ArticleCategoryLogic::createCategory($data);
  96. // 清除相关缓存
  97. self::clearCategoryCache();
  98. return $category;
  99. }
  100. /**
  101. * 更新分类
  102. *
  103. * @param int $id 分类ID
  104. * @param array $data 分类数据
  105. * @return bool
  106. */
  107. public static function updateCategory(int $id, array $data): bool
  108. {
  109. $result = ArticleCategoryLogic::updateCategory($id, $data);
  110. // 清除相关缓存
  111. self::clearCategoryCache();
  112. return $result;
  113. }
  114. /**
  115. * 删除分类
  116. *
  117. * @param int $id 分类ID
  118. * @return bool
  119. */
  120. public static function deleteCategory(int $id): bool
  121. {
  122. $result = ArticleCategoryLogic::deleteCategory($id);
  123. // 清除相关缓存
  124. self::clearCategoryCache();
  125. return $result;
  126. }
  127. /**
  128. * 清除分类相关缓存
  129. *
  130. * @return void
  131. */
  132. public static function clearCategoryCache(): void
  133. {
  134. Cache::forget('article_categories_active');
  135. Cache::forget('article_categories_all');
  136. Cache::forget('article_category_tree_active');
  137. Cache::forget('article_category_tree_all');
  138. }
  139. }