BitrixEvent¶
Событие Bitrix — payload события роутера, которое пришло через BitrixEventBridge.
final class ValidateProduct implements ListenerInterface
{
public static function handle(EventInterface $event): void
{
$bitrix = $event->getPayload();
Assert::isInstanceOf($bitrix, BitrixEvent::class);
if (($bitrix->getFields()['NAME'] ?? '') === '') {
$bitrix->cancel('Название товара обязательно');
}
}
}
Bitrix вызывает обработчики двумя способами, и BitrixEvent поддерживает оба:
| Стиль | Как пришли данные | Чем читать |
|---|---|---|
старый API (GetModuleEvents(), &$arFields) |
позиционные аргументы | getFields(), setField(), getArguments() |
D7 (Bitrix\Main\Event::send()) |
объект Bitrix\Main\Event |
getD7Event() |
Это осознанное исключение из неизменяемости событий: setField() и cancel() меняют
данные, которые вернутся в Bitrix. Объект общий для всех слушателей события,
поэтому изменения одного слушателя видят следующие.
После cancel() рассылка останавливается (PSR-14 StoppableEventInterface):
остальные слушатели получают статус Skipped.
- Full name:
\Selyusize\EventsRouter\Bitrix\BitrixEvent - This class is marked as final and can't be subclassed
- This class implements:
StoppableEventInterface - This class is a Final class
Methods¶
getModuleId¶
getEventType¶
getHandlers¶
Все обработчики, которые Bitrix вызовет на это событие, в порядке вызова.
Список берётся из EventManager, а не из маршрутов роутера, поэтому в нём все обработчики
любых неймспейсов: из addEventHandler() в init.php, зарегистрированные модулями
в b_module_to_module и сам мост роутера — по его месту видно, кто вызван до слушателей роутера.
[
'App\\Catalog\\ProductHandler::onBeforeUpdate',
'CIBlockPropertyDirectory::onBeforeUpdate (iblock)', // модуль из b_module_to_module
'Closure /local/php_interface/init.php:42',
'Selyusize\\EventsRouter\\Bitrix\\BitrixEventBridge::bitrix.iblock.OnBeforeIBlockElementUpdate',
]
Return Value:
Класс::метод, имя функции, Closure файл:строка или путь к файлу обработчика;
у обработчиков модулей в скобках — id модуля
getD7Event¶
Объект события D7 или null, если событие пришло через старый API.
getArguments¶
Позиционные аргументы старого API: [$arFields], [$ID, $arFields] и т. п.
getFields¶
Поля из первого аргумента старого API (&$arFields).
Throws:
если первый аргумент не массив — например, у события D7
- LogicException
setField¶
Изменить поле в &$arFields: Bitrix получит новое значение.
Работает в OnBefore*-событиях старого API, где Bitrix передаёт поля по ссылке.
Parameters:
| Parameter | Type | Description |
|---|---|---|
$name |
string | |
$value |
mixed |
Throws:
если первый аргумент не массив
- LogicException
cancel¶
Отменить действие в OnBefore*-событии.
Bitrix получит отказ: в старом API — false и $APPLICATION->ThrowException($reason),
в D7 — EventResult::ERROR с причиной в параметрах. Остальные слушатели не вызываются.
Parameters:
| Parameter | Type | Description |
|---|---|---|
$reason |
string |
getCancelReason¶
Причина отмены или null, если действие не отменяли.