AddonsEventService.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. <?php
  2. namespace services\common;
  3. use common\enums\AppEnum;
  4. use common\enums\RedisKeyEnum;
  5. use common\helpers\AddonHelper;
  6. use common\models\common\AddonsEvent;
  7. use Yii;
  8. use yii\base\Exception;
  9. use yii\helpers\Json;
  10. use common\components\Service;
  11. use common\helpers\ArrayHelper;
  12. use common\traits\ErrorTrait;
  13. /**
  14. *
  15. * 插件公共时间
  16. * Class AddonsLinkService
  17. * @Author: lun
  18. * @DateTime: 2021/10/14 0014 14:15
  19. * @Copyright: copyright (c) 2021 广东七件事集团
  20. * @package services\common
  21. */
  22. class AddonsEventService extends Service
  23. {
  24. use ErrorTrait;
  25. /**
  26. * 创建链接菜单
  27. * @Author: lun
  28. * @DateTime: 2021/10/14 0014 14:16
  29. * @Copyright: copyright (c) 2021 广东七件事集团
  30. * @param string $addons_name
  31. * @throws \yii\db\Exception
  32. */
  33. public function create(string $addons_name, array $eventsMenu)
  34. {
  35. try {
  36. // 重组数组
  37. foreach ($eventsMenu as $key => $menu) {
  38. $allMenu[$key] = ArrayHelper::regroupMapToArr($menu);
  39. }
  40. $time = time();
  41. foreach ($allMenu as $key => $item) {
  42. foreach ($item as $k => $value) {
  43. $listeners = Json::encode($value['listeners']);
  44. $event = AddonsEvent::findOne(['addons_name' => $addons_name, 'event_name' => $value['event_name']]);
  45. if ($event) {
  46. if (Json::encode($event['listeners']) != $listeners) {
  47. $event->listeners = $value['listeners'];
  48. $event->save();
  49. }
  50. } else {
  51. $row = [];
  52. $row['addons_name'] = $addons_name;
  53. $row['event_name'] = $value['event_name'] ?? [];
  54. $row['listeners'] = $listeners;
  55. $row['created_at'] = $time;
  56. $row['updated_at'] = $time;
  57. $rows[] = $row;
  58. }
  59. }
  60. }
  61. if (empty($rows)) return true;
  62. $field = ['addons_name', 'event_name', 'listeners', 'created_at', 'updated_at'];
  63. // 批量插入数据
  64. $res = Yii::$app->db->createCommand()->batchInsert(AddonsEvent::tableName(), $field, $rows)->execute();
  65. if (!$res) throw new Exception("事件创建失败");
  66. return true;
  67. } catch (Exception $e) {
  68. $this->error = $e->getMessage();
  69. return false;
  70. }
  71. }
  72. /**
  73. * 获取插件全局事件
  74. * @Author: lun
  75. * @DateTime: 2021/10/15 0015 15:54
  76. * @Copyright: copyright (c) 2021 广东七件事集团
  77. * @param array $mainEvent 主事件
  78. * @param string $eventName 事件名称
  79. * @return array
  80. */
  81. public static function event(array $mainEvent, string $eventName)
  82. {
  83. $cache = Yii::$app->cache;
  84. $cache_key = RedisKeyEnum::suffix('EVENT_', $eventName );
  85. $event = $cache->get($cache_key);// 获取缓存中的事件数据
  86. // 缓存无数据则对表进行查询
  87. if (empty($event)) {
  88. $event = [];
  89. $event_list = AddonsEvent::getAddonsEvent([['event_name' => $eventName]],[],true,'listeners');
  90. if ($event_list) {
  91. // 循环组合对应事件的监听地址
  92. foreach ($event_list as $listeners) {
  93. $listenerArr = Json::decode($listeners['listeners'], true);
  94. foreach ($listenerArr as $listener) {
  95. $event[] = $listener;
  96. }
  97. }
  98. if ($event) $cache->set($cache_key, $event);// 保存至缓存
  99. }
  100. }
  101. // 跟主事件合并返回注册事件
  102. return array_merge($mainEvent, $event);
  103. }
  104. }