Remove event handlers and custom namespaces no longer defined by module.xml

This commit is contained in:
Kijin Sung 2023-08-11 00:34:44 +09:00
parent acc1117d26
commit 68ddac96e7
2 changed files with 60 additions and 0 deletions

View file

@ -1398,9 +1398,13 @@ class ModuleController extends Module
public function registerEventHandlers(string $module_name)
{
$module_action_info = ModuleModel::getModuleActionXml($module_name);
$registered_event_handlers = [];
// Insert new event handlers.
foreach ($module_action_info->event_handlers ?? [] as $ev)
{
$key = implode(':', [$ev->event_name, $module_name, $ev->class_name, $ev->method, $ev->position]);
$registered_event_handlers[$key] = true;
if(!ModuleModel::getTrigger($ev->event_name, $module_name, $ev->class_name, $ev->method, $ev->position))
{
$output = $this->insertTrigger($ev->event_name, $module_name, $ev->class_name, $ev->method, $ev->position);
@ -1411,6 +1415,28 @@ class ModuleController extends Module
}
}
// Remove event handlers that are no longer defined by this module.
if (count($registered_event_handlers))
{
foreach ($GLOBALS['__triggers__'] as $trigger_name => $val1)
{
foreach ($val1 as $called_position => $val2)
{
foreach ($val2 as $item)
{
if ($item->module === $module_name)
{
$key = implode(':', [$trigger_name, $item->module, $item->type, $item->called_method, $called_position]);
if (!isset($registered_event_handlers[$key]))
{
$this->deleteTrigger($trigger_name, $item->module, $item->type, $item->called_method, $called_position);
}
}
}
}
}
}
return new BaseObject();
}
@ -1426,6 +1452,7 @@ class ModuleController extends Module
$namespaces = config('namespaces') ?? [];
$changed = false;
// Add all namespaces defined by this module.
foreach ($module_action_info->namespaces ?? [] as $name)
{
if(!isset($namespaces[$name]))
@ -1435,6 +1462,16 @@ class ModuleController extends Module
}
}
// Remove namespaces that are no longer defined by this module.
foreach ($namespaces as $name => $attached_module)
{
if ($attached_module === $module_name && !in_array($name, $module_action_info->namespaces ?? []))
{
unset($namespaces[$name]);
}
}
// Update system configuration.
if ($changed)
{
Rhymix\Framework\Config::set('namespaces', $namespaces);

View file

@ -1633,13 +1633,36 @@ class ModuleModel extends Module
}
// Check if all event handlers are registered.
$registered_event_handlers = [];
foreach ($module_action_info->event_handlers ?? [] as $ev)
{
$key = implode(':', [$ev->event_name, $module_name, $ev->class_name, $ev->method, $ev->position]);
$registered_event_handlers[$key] = true;
if(!ModuleModel::getTrigger($ev->event_name, $module_name, $ev->class_name, $ev->method, $ev->position))
{
$info->need_update = true;
}
}
if (count($registered_event_handlers))
{
foreach ($GLOBALS['__triggers__'] as $trigger_name => $val1)
{
foreach ($val1 as $called_position => $val2)
{
foreach ($val2 as $item)
{
if ($item->module === $module_name)
{
$key = implode(':', [$trigger_name, $item->module, $item->type, $item->called_method, $called_position]);
if (!isset($registered_event_handlers[$key]))
{
$info->need_update = true;
}
}
}
}
}
}
// Check if all namespaces are registered.
$namespaces = config('namespaces') ?? [];