События D7 в 1С-Битрикс: EventManager и обработчики
Как зарегистрировать обработчик EventManager, получить параметры события, вернуть EventResult и правильно удалить регистрацию при деинсталляции.
Системные требования
Нужны тестовая копия проекта, доступ разработчика или администратора и резервная копия перед изменением рабочего кода.
Смотреть системные требования1. Выберите событие и контракт
Найдите событие в официальной документации модуля и проверьте, когда оно вызывается: до операции, после неё или при формировании результата. Зафиксируйте тип параметров и допустимый ответ.
Не подменяйте событием бизнес-процесс, если действие должно иметь очередь, повторы и отдельный журнал.
2. Добавьте временный обработчик
Для обработчика на время текущего запроса используйте singleton:
use Bitrix\Main\EventManager;
EventManager::getInstance()->addEventHandler(
"main", "OnAfterUserAdd",
[UserEvents::class, "afterAdd"]
);Размещайте класс в автозагружаемом пространстве имён проекта.
Совет
Обработчик должен быть быстрым и повторяемым. Не выполняйте в событии долгий внешний запрос без тайм-аута и очереди: это замедляет основную операцию пользователя.
3. Зарегистрируйте обработчик модуля
Постоянную регистрацию выполняйте при установке модуля через registerEventHandler(), передавая модуль-источник, событие, ID своего модуля, класс и метод.
При удалении модуля симметрично вызовите unRegisterEventHandler(). Иначе система сохранит ссылку на отсутствующий класс.
4. Прочитайте параметры и верните результат
Современный обработчик получает объект Bitrix\Main\Event:
public static function handle(Event $event): EventResult
{
$fields = $event->getParameters();
return new EventResult(EventResult::SUCCESS, ["checked" => true]);
}Для старых событий с позиционными аргументами используйте compatible-методы только по документации.
5. Обеспечьте безопасное выполнение
Проверяйте наличие обязательных полей, избегайте рекурсивного повторного запуска события и журналируйте только технические идентификаторы. Исключения обрабатывайте там, где ошибка не должна ломать основную операцию.
Напишите тесты для повторного вызова и сценария, когда внешний сервис недоступен.
Была ли эта статья полезной?
Спасибо за ваш отзыв!