Ядро
События 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'
);
}
}