chore(event): 更新InitAddon,要求手动添加了addon,也会更新缓存,添加到监听事件中
This commit is contained in:
@@ -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_model = new Addon();
|
||||||
$addon_data = $addon_model->getAddonList([], 'name');
|
$addon_data = $addon_model->getAddonList([], 'name');
|
||||||
|
$current_addons = $addon_data['data'];
|
||||||
|
|
||||||
$listen_array = [];
|
// 构建新的插件事件映射
|
||||||
foreach ($addon_data[ 'data' ] as $k => $v) {
|
$new_addon_events = [];
|
||||||
if (file_exists('addon/' . $v[ 'name' ] . '/config/event.php')) {
|
$new_merged_listeners = [];
|
||||||
$addon_event = require_once 'addon/' . $v[ 'name' ] . '/config/event.php';
|
|
||||||
|
|
||||||
|
// 遍历当前插件,收集事件信息
|
||||||
|
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'] ?? [];
|
$listen = $addon_event['listen'] ?? [];
|
||||||
|
|
||||||
if (!empty($listen)) {
|
if (!empty($listen)) {
|
||||||
$listen_array[] = $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));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 获取当前所有事件名称
|
||||||
|
$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));
|
||||||
}
|
}
|
||||||
Cache::tag("addon")->set("addon_event_list", $listen_array);
|
$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 {
|
} else {
|
||||||
$listen_array = $cache;
|
// 事件不存在监听,直接添加
|
||||||
|
if (!empty($target_listeners)) {
|
||||||
|
Event::listenEvents([$event => $target_listeners]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!empty($listen_array)) {
|
|
||||||
foreach ($listen_array as $k => $listen) {
|
|
||||||
if (!empty($listen)) {
|
|
||||||
Event::listenEvents($listen);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 更新缓存
|
||||||
|
Cache::tag("addon")->set("addon_event_list", [
|
||||||
|
'addon_events' => $new_addon_events,
|
||||||
|
'merged_listeners' => $new_merged_listeners
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user