Yandex Metrika
sanches.free

События D7 без ORM: Event, EventResult и цепочка обработчиков

Базовый контур

В ядре D7 события — это объекты \Bitrix\Main\Event. Их подписывают через EventManager::addEventHandler($module, $event, callable), а внутри обработчика возвращают \Bitrix\Main\EventResult с типом и полезной нагрузкой.

Обработчик с учётом предыдущих результатов

Типичный приём: прочитать параметр с индексом 0, затем пройти по $event->getResults() и забрать данные от обработчиков, которые отработали раньше, если их тип не ERROR.

namespace Grain\ForumAccess;

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

EventManager::getInstance()->addEventHandler(
    'grain.forum',
    'OnGlobalsGetForumFilter',
    __NAMESPACE__ . '\Handlers::extendFilter'
);

class Handlers
{
    public static function extendFilter(Event $event)
    {
        $filter = $event->getParameter(0);
        foreach ($event->getResults() as $foreign) {
            if ($foreign->getType() === EventResult::ERROR) {
                continue;
            }
            if ($foreign->getParameters()) {
                $filter = $foreign->getParameters();
            }
        }
        $filter['SITE_ID'] = ['s1', 's2'];
        return new EventResult($event->getEventType(), $filter);
    }
}

Отправка и разбор ответа

use Bitrix\Main\Event;
use Bitrix\Main\EventResult;

$bus = new Event('grain.forum', 'OnGlobalsGetFilter', [$arFilter]);
$bus->send();
foreach ($bus->getResults() as $piece) {
    if ($piece->getType() === EventResult::ERROR) {
        continue;
    }
    $arFilter = array_merge($arFilter, (array)$piece->getParameters());
}

Именованные параметры

Параметры события могут быть ассоциативным массивом — тогда в обработчике удобно звать $event->getParameter('ENTITY').

$bus = new Event('partner.mymodule', 'OnMyEvent', ['ENTITY' => $order]);
$bus->send();

// в обработчике:
// $order = $event->getParameter('ENTITY');

Итог

Даже без ORM события D7 дают предсказуемую цепочку: регистрация, merge результатов, явные коды успеха/ошибки и именованные полезные нагрузки.

Не хотите копаться сами?

Починю за 1-3 дня. Без предоплаты — оплата по результату.

15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии