События 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 дней гарантии