Yandex Metrika
sanches.free

Классические события D7: Event и EventManager вне ORM

Место модели событий

Рядом с 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 дней гарантии