PHP
#bitrix#module#events#EventManager#DoInstall#DoUninstall#registerEventHandler

Модуль Битрикс: регистрация и снятие обработчиков событий при установке/удалении

Регистрация обработчиков через EventManager в DoInstall() и обязательное unRegisterEventHandler в DoUninstall(). По документации Битрикс — без висячих хендлеров после удаления модуля.

Как использовать

  1. Регистрируйте обработчики только в DoInstall() через EventManager::getInstance()->registerEventHandler().
  2. В DoUninstall() вызывайте unRegisterEventHandler() с теми же параметрами (модуль, событие, ID модуля, класс, метод).
  3. Класс-обработчик держите в lib/ модуля и подключайте через автозагрузку (include.php).
  4. Не регистрируйте события в 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 модуля — так обработчики не будут сняты при удалении модуля.