Место модели событий
Рядом с ORM-хуками есть «плоские» точки расширения: модуль, событие, массив аргументов. Ими пользуются миграционные решения до полного перехода на новые API и кастомные модули, где важнее явный контракт, чем рефлексия таблицы.
Подключение слушателя
addEventHandler регистрирует коллбек на связку модуль событие. Внутри обработчика $event->getResults() позволяет учесть правки более ранних обработчиков той же волны: пропускают записи с типом ошибки и сливают параметры там, где ядро ожидает накопительный массив.
Отправка и параметры со строковыми ключами
Вторым аргументом конструктора Event идёт имя события, третьим — либо индексный список, либо ассоциативная карта для $event->getParameter('ENTITY').
use Bitrix\Main\Event;
use Bitrix\Main\EventManager;
use Bitrix\Main\EventResult;
EventManager::getInstance()->addEventHandler(
'partner.api',
'OnShipmentFilterNormalize',
static function (Event $pulseEvent): EventResult {
$carrierFilter = (array) $pulseEvent->getParameter(0);
foreach ($pulseEvent->getResults() as $slot) {
if ($slot->getType() === EventResult::ERROR) {
continue;
}
if ($slot->getParameters()) {
$carrierFilter = $slot->getParameters();
}
}
$carrierFilter['SITE_ID'] = ['s1', 's2'];
return new EventResult($pulseEvent->getEventType(), $carrierFilter);
}
);
$dispatch = new Event('partner.api', 'OnShipmentFilterNormalize', [$baseFilter]);
$dispatch->send();
foreach ($dispatch->getResults() as $slot) {
if ($slot->getType() === EventResult::ERROR) {
continue;
}
$baseFilter = array_merge($baseFilter, (array) $slot->getParameters());
}
$namedPulse = new Event('partner.orders', 'OnPackageReady', ['ENTITY' => $orderDraft]);
$namedPulse->send();Замечания по эксплуатации
- Тяжёлые действия выносят в отложенные очереди, а событие оставляют синхронной точкой согласования данных.
- Не полагаться на статический порядок подписчиков между разными модулями без явной приоритизации в регистрации.
Не хотите копаться сами?
Починю за 1-3 дня. Без предоплаты — оплата по результату.
15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии