← К документации

Ядро

События EventManager

Рабочая справка по событиям Bitrix Framework: EventManager, addEventHandler, registerEventHandler, совместимые обработчики и свои события.

События позволяют подключать свою логику к ядру и модулям без правки их файлов. В локальных модулях постоянные обработчики обычно регистрируют при установке и удаляют при удалении.

Способ регистрации зависит от сигнатуры события. Старые события, передающие набор аргументов, требуют Compatible; собственный Bitrix\Main\Event передаёт объект события.

Основы

EventManager управляет обработчиками событий в новом ядре.

Что такое EventManager

EventManager используется для краткосрочной и долгосрочной регистрации обработчиков событий.

<?php

use Bitrix\Main\EventManager;

function fetchEventManager(): EventManager {
    return EventManager::getInstance();
}

$event_manager = fetchEventManager();

Временные и постоянные обработчики

Метод Когда использовать
addEventHandler() Временный обработчик на текущий хит.
registerEventHandler() Постоянный обработчик, который хранится в системе.
unRegisterEventHandler() Удаление постоянного обработчика.

Совместимые обработчики

Для старых событий, где обработчик ожидает старый набор аргументов, часто используют методы с суффиксом Compatible.

$event_manager->registerEventHandlerCompatible(
    'crm',
    'OnAfterCrmDealUpdate',
    'test.example',
    \test\Example\EventHandler\DealHandler::class,
    'onAfterDealUpdate'
);

Регистрация

Примеры регистрации обработчиков в коде и в установщике модуля.

addEventHandler

<?php

use Bitrix\Main\Event;
use Bitrix\Main\EventManager;

function addTemporaryHandler(): void {
    EventManager::getInstance()->addEventHandlerCompatible(
        'main',
        'OnProlog',
        function (): void {
            AddMessage2Log('OnProlog выполнен', 'event_debug');
        }
    );
}

addTemporaryHandler();

registerEventHandler

<?php

use Bitrix\Main\EventManager;

const MODULE_ID = 'test.example';

function registerModuleEventHandler(): void {
    EventManager::getInstance()->registerEventHandlerCompatible(
        'main',
        'OnProlog',
        MODULE_ID,
        \test\Example\EventHandler\PrologHandler::class,
        'onProlog'
    );
}

registerModuleEventHandler();

unRegisterEventHandler

<?php

use Bitrix\Main\EventManager;

const MODULE_ID = 'test.example';

function unregisterModuleEventHandler(): void {
    EventManager::getInstance()->unRegisterEventHandler(
        'main',
        'OnProlog',
        MODULE_ID,
        \test\Example\EventHandler\PrologHandler::class,
        'onProlog'
    );
}

unregisterModuleEventHandler();

Свои события

Модуль может не только слушать чужие события, но и отправлять свои.

Отправить событие

<?php

use Bitrix\Main\Event;

const MODULE_ID = 'test.example';

function sendExampleEvent(int $item_id): void {
    $event = new Event(
        MODULE_ID,
        'OnAfterExampleItemProcessed',
        [
            'item_id' => $item_id,
        ]
    );

    $event->send();
}

sendExampleEvent($item_id);

Обработать событие

<?php

namespace test\Example\EventHandler;

use Bitrix\Main\Event;

class ExampleHandler {
    public static function onAfterExampleItemProcessed(Event $event): void {
        $parameters = $event->getParameters();
        $item_id = (int) ($parameters['item_id'] ?? 0);

        AddMessage2Log(
            [
                'message' => 'Элемент обработан',
                'item_id' => $item_id,
            ],
            'example_event'
        );
    }
}

Источники