chore(event): 更新InitAddon,要求手动添加了addon,也会更新缓存,添加到监听事件中
This commit is contained in:
@@ -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
|
||||
]);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user