chore(event): 更新InitAddon,要求手动添加了addon,也会更新缓存,添加到监听事件中

This commit is contained in:
2025-12-03 11:12:13 +08:00
parent fec0198537
commit dac15250a2

View File

@@ -25,36 +25,72 @@ class InitAddon
{ {
$cache = Cache::get("addon_event_list"); $cache = Cache::get("addon_event_list");
if (!defined("initroute_tag")) exit(); if (!defined("initroute_tag")) exit();
if (empty($cache)) {
$addon_model = new Addon(); // 获取当前插件列表
$addon_data = $addon_model->getAddonList([], 'name'); $addon_model = new Addon();
$addon_data = $addon_model->getAddonList([], 'name');
$listen_array = []; $current_addons = $addon_data['data'];
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'; $new_addon_events = [];
$new_merged_listeners = [];
$listen = $addon_event['listen'] ?? [];
if (!empty($listen)) { // 遍历当前插件,收集事件信息
$listen_array[] = $listen; 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) { $all_events = array_keys($new_merged_listeners);
if (!empty($listen)) { if (!empty($cache) && isset($cache['addon_events'])) {
Event::listenEvents($listen); $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
]);
} }
} }