Сниппеты
Назад к сниппетам

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

Регистрация обработчиков через 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 модуля — так обработчики не будут сняты при удалении модуля.