Модуль Битрикс: регистрация и снятие обработчиков событий при установке/удалении
Регистрация обработчиков через EventManager в DoInstall() и обязательное unRegisterEventHandler в DoUninstall(). По документации Битрикс — без висячих хендлеров после удаления модуля.
Как использовать
- Регистрируйте обработчики только в DoInstall() через EventManager::getInstance()->registerEventHandler().
- В DoUninstall() вызывайте unRegisterEventHandler() с теми же параметрами (модуль, событие, ID модуля, класс, метод).
- Класс-обработчик держите в lib/ модуля и подключайте через автозагрузку (include.php).
- Не регистрируйте события в include.php или init.php без привязки к установке — иначе после удаления модуля останутся висячие хендлеры.
Закрывает боль: после удаления модуля обработчики событий продолжают вызываться (модуль удалён, а хендлеры остались в системе) или при переустановке дублируются. По документации Битрикс события модуля должны регистрироваться при установке и сниматься при удалении.
Регистрация в DoInstall():
use Bitrix\Main\EventManager;
public function DoInstall()
{
global $APPLICATION;
$this->InstallDB();
$this->InstallEvents();
$this->InstallFiles();
\Bitrix\Main\ModuleManager::registerModule($this->MODULE_ID);
$APPLICATION->IncludeAdminFile('Установка модуля', __DIR__ . '/install/step.php');
}
public function InstallEvents()
{
$em = EventManager::getInstance();
$em->registerEventHandler(
'main', // модуль-источник события
'OnPageStart', // имя события
'vendor.simplemodule', // ID вашего модуля
'Vendor\\SimpleModule\\EventHandler',
'onPageStart'
);
return true;
}
Снятие в DoUninstall():
public function DoUninstall()
{
global $APPLICATION;
$this->UnInstallEvents();
$this->UnInstallFiles();
$this->UnInstallDB();
\Bitrix\Main\ModuleManager::unRegisterModule($this->MODULE_ID);
$APPLICATION->IncludeAdminFile('Удаление модуля', __DIR__ . '/install/unstep.php');
}
public function UnInstallEvents()
{
$em = EventManager::getInstance();
$em->unRegisterEventHandler(
'main',
'OnPageStart',
'vendor.simplemodule',
'Vendor\\SimpleModule\\EventHandler',
'onPageStart'
);
return true;
}
Класс-обработчик (lib/EventHandler.php):
<?php
namespace Vendor\SimpleModule;
class EventHandler
{
public static function onPageStart()
{
// только минимальная логика; тяжёлую выносите в сервисы
}
}
Важно: Параметры unRegisterEventHandler() должны в точности совпадать с registerEventHandler(). Не вызывайте AddEventHandler() в include.php модуля — так обработчики не будут сняты при удалении модуля.