technique102/bitrix-events-attributes

Use the php8 attribute in Bitrix for event handlers

v0.1.4 2023-06-06 11:20 UTC

This package is auto-updated.

Last update: 2024-06-06 13:36:53 UTC


README

Latest Stable Version Total Downloads License PHP Version Require

Пакет поможет избавиться от классической ситуации при разработке на 1С-Битрикс, когда есть файл events.php который подключается в init.php и в котором большое количество вызовов \Bitrix\Main\EventManager::getInstance()->addEventHandler().

Регистрация обработчика событий происходит через атрибуты, которые указываются рядом с методом класса который и будет выполнять обработку события.

Установка через composer

composer require technique102/bitrix-events-attributes

Простое использование

Создадим класс с методами которые будут обрабатывать события.

Пометим метод атрибутом EventHandler с указанием модуля и типа события.

Методов с обработчиками в классе может быть несколько.

Более того один обработчик может вызываться в разных событиях.

Важно помнить, что параметры передаваемые в обработчик могут отличаться в зависимости от события, особенно в событиях старого ядра.

Так же можно указывать сортировку, по умолчанию 100.

use Technique102\BitrixEventsAttributes\Attributes\EventHandler;

class Handlers
{
    #[EventHandler('main', 'OnPageStart', 10)]
    #[EventHandler('main', 'OnPageStart')]
    public static function handlerOne(): void
    {
        \Bitrix\Main\Diag\Debug::writeToFile('WORK handlerOne!!!', '', 'bitrix_log.txt');
    }
    
    #[EventHandler('catalog', '\Bitrix\Catalog\Product::OnBeforeUpdate')]
    #[EventHandler('catalog', '\Bitrix\Catalog\Product::OnAfterAdd')]
    public static function handlerTwo(\Bitrix\Main\Event $e): void
    {
        \Bitrix\Main\Diag\Debug::writeToFile($e->getParameters(), '', 'bitrix_log.txt');
    }
    
    #[EventHandler('main', 'OnPageStart', 50)]
    public static function handlerThree(): void
    {
        \Bitrix\Main\Diag\Debug::writeToFile('WORK handlerThree!!!', '', 'bitrix_log.txt');
    }
}

Далее в init.php создаем менеджер событий и добавляем туда наш класс.

use Technique102\BitrixEventsAttributes\EventManager;

$eventManager = EventManager::getInstance();
$eventManager->addEventHandlerClass(Handlers::class);
$eventManager->boot();

Можно добавлять сколько угодно классов через метод addEventHandlerClass.

Использование через настройки модуля

Тут почти все то же самое, что и в простом использовании, только добавление классов происходит через файл .settings.php в модулях.

Класс с обработчиками событий при этом лежит в модуле.

Создаем в нужном модуле файл .settings.php.

В нем описываем значения для eventHandlerClasses, примерно так:

<?php
return [
    'eventHandlerClasses' => [
        'value' => [
            \Vendor\ModuleName\EventHandlers\OnAfterUserAuthorize::class
        ],
        'readonly' => true
    ]
];

Класс по структуре точно такой же как и Handlers из примера с простым использованием.

Далее в init.php создаем менеджер событий (если еще не создан) только уже без добавления класса руками.

Оба способа работают вместе. Подключаются классы из всех модулей, в которых есть описание настройки eventHandlerClasses, и следом подключается то что добавлили через $eventManager->addEventHandlerClass() в init.php.

Требования как и при обычном использовании \Bitrix\Main\EventManager::getInstance()->addEventHandler(), классы с обработчиками должны быть доступны для вызовов, т.е. подгружены через автолоад модулей или кастомно.

В классе может быть 10 методов которые отвечают за обработку событий. Если раньше для этого прописывалось 10 раз \Bitrix\Main\EventManager::getInstance()->addEventHandler(), то сейчас будет достаточно передать класс в менеджер событий пакета $eventManager->addEventHandlerClass(Handlers::class).