Назад к сниппетам
Модуль Битрикс: регистрация и снятие обработчиков событий при установке/удалении
Регистрация обработчиков через EventManager в DoInstall() и обязательное unRegisterEventHandler в DoUninstall(). По документации Битрикс — без висячих хендлеров после удаления модуля.
php
9 февраля 2026 г.
Закрывает боль: после удаления модуля обработчики событий продолжают вызываться (модуль удалён, а хендлеры остались в системе) или при переустановке дублируются. По документации Битрикс события модуля должны регистрироваться при установке и сниматься при удалении.
Регистрация в 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 модуля — так обработчики не будут сняты при удалении модуля.