From dac15250a2c07a4af4139eafcdade29c910a9043 Mon Sep 17 00:00:00 2001 From: ZF sun <34314687@qq.com> Date: Wed, 3 Dec 2025 11:12:13 +0800 Subject: [PATCH] =?UTF-8?q?chore(event):=20=E6=9B=B4=E6=96=B0InitAddon?= =?UTF-8?q?=EF=BC=8C=E8=A6=81=E6=B1=82=E6=89=8B=E5=8A=A8=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E4=BA=86addon=EF=BC=8C=E4=B9=9F=E4=BC=9A=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E7=BC=93=E5=AD=98=EF=BC=8C=E6=B7=BB=E5=8A=A0=E5=88=B0=E7=9B=91?= =?UTF-8?q?=E5=90=AC=E4=BA=8B=E4=BB=B6=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/event/init/InitAddon.php | 82 +++++++++++++++++++++++--------- 1 file changed, 59 insertions(+), 23 deletions(-) diff --git a/src/app/event/init/InitAddon.php b/src/app/event/init/InitAddon.php index b730fb076..a327eb3a2 100644 --- a/src/app/event/init/InitAddon.php +++ b/src/app/event/init/InitAddon.php @@ -25,36 +25,72 @@ class InitAddon { $cache = Cache::get("addon_event_list"); if (!defined("initroute_tag")) exit(); - if (empty($cache)) { - $addon_model = new Addon(); - $addon_data = $addon_model->getAddonList([], 'name'); - - $listen_array = []; - foreach ($addon_data[ 'data' ] as $k => $v) { - if (file_exists('addon/' . $v[ 'name' ] . '/config/event.php')) { - $addon_event = require_once 'addon/' . $v[ 'name' ] . '/config/event.php'; - - $listen = $addon_event['listen'] ?? []; - if (!empty($listen)) { - $listen_array[] = $listen; + + // 获取当前插件列表 + $addon_model = new Addon(); + $addon_data = $addon_model->getAddonList([], 'name'); + $current_addons = $addon_data['data']; + + // 构建新的插件事件映射 + $new_addon_events = []; + $new_merged_listeners = []; + + // 遍历当前插件,收集事件信息 + foreach ($current_addons as $addon) { + if (file_exists('addon/' . $addon['name'] . '/config/event.php')) { + $addon_event = require_once 'addon/' . $addon['name'] . '/config/event.php'; + $listen = $addon_event['listen'] ?? []; + + if (!empty($listen)) { + $new_addon_events[$addon['name']] = $listen; + + // 合并事件监听器 + foreach ($listen as $event => $listeners) { + if (!isset($new_merged_listeners[$event])) { + $new_merged_listeners[$event] = []; + } + $new_merged_listeners[$event] = array_unique(array_merge($new_merged_listeners[$event], $listeners)); } } - } - Cache::tag("addon")->set("addon_event_list", $listen_array); - } else { - $listen_array = $cache; } - - if (!empty($listen_array)) { - foreach ($listen_array as $k => $listen) { - if (!empty($listen)) { - Event::listenEvents($listen); + + // 获取当前所有事件名称 + $all_events = array_keys($new_merged_listeners); + if (!empty($cache) && isset($cache['addon_events'])) { + $old_addon_events = $cache['addon_events']; + // 合并旧事件名称,确保所有事件都被处理 + $old_events = []; + foreach ($old_addon_events as $event_listeners) { + $old_events = array_merge($old_events, array_keys($event_listeners)); + } + $old_events = array_unique($old_events); + $all_events = array_unique(array_merge($all_events, $old_events)); + } + + // 处理每个事件的监听器 + foreach ($all_events as $event) { + // 获取当前事件的目标监听器列表 + $target_listeners = $new_merged_listeners[$event] ?? []; + + // 检查事件是否已存在监听 + if (Event::hasListener($event)) { + // 直接重新设置该事件的监听器,覆盖旧的监听器 + // 这样可以确保移除已删除插件的监听器,同时只保留当前有效的监听器 + Event::listenEvents([$event => $target_listeners]); + } else { + // 事件不存在监听,直接添加 + if (!empty($target_listeners)) { + Event::listenEvents([$event => $target_listeners]); } - } } - + + // 更新缓存 + Cache::tag("addon")->set("addon_event_list", [ + 'addon_events' => $new_addon_events, + 'merged_listeners' => $new_merged_listeners + ]); } } \ No newline at end of file