Перейти к содержанию

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

public getModuleId(): string

getEventType

public getEventType(): string

getHandlers

Все обработчики, которые Bitrix вызовет на это событие, в порядке вызова.

public getHandlers(): list<string>

Список берётся из 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.

public getD7Event(): ?\Bitrix\Main\Event

getArguments

Позиционные аргументы старого API: [$arFields], [$ID, $arFields] и т. п.

public getArguments(): list

getFields

Поля из первого аргумента старого API (&$arFields).

public getFields(): array<array-key,mixed>

Throws:

если первый аргумент не массив — например, у события D7 - LogicException


setField

Изменить поле в &$arFields: Bitrix получит новое значение.

public setField(string $name, mixed $value): void

Работает в OnBefore*-событиях старого API, где Bitrix передаёт поля по ссылке.

Parameters:

Parameter Type Description
$name string
$value mixed

Throws:

если первый аргумент не массив - LogicException


cancel

Отменить действие в OnBefore*-событии.

public cancel(string $reason): void

Bitrix получит отказ: в старом API — false и $APPLICATION->ThrowException($reason), в D7 — EventResult::ERROR с причиной в параметрах. Остальные слушатели не вызываются.

Parameters:

Parameter Type Description
$reason string

getCancelReason

Причина отмены или null, если действие не отменяли.

public getCancelReason(): ?string

isPropagationStopped

public isPropagationStopped(): bool