Skip to content
TsSaltan edited this page May 21, 2023 · 17 revisions

Работа с хуками

Функционал хуков описан в файле its-framework/Hook.php. Хук позволяет перехватить и выполнить код в том или ином событии, список существующих событий представлен ниже.

Пример работы с хуком

// Регистрация хука
Hook::register('hook.name', function(){
    // Выполнение кода во время вызова хука
});

// Этот хук выполнится один раз
Hook::registerOnce('hook.name', function(){
    // Выполнение кода...
});

Hook::register('hook.name', function(){
    // Этот хук выполнится раньше всех, т.к. 3-й аргумент - приоритет равен 0. Чем меньше значение приоритета, тем раньше будет вызван хук
}, 0);



// Вызов хука где-то в приложении
Hook::call('hook.name');


// Другой пример
Hook::register('another.hook', function(string $a, int $b){
    return $a . '-' . $b;
}, 0);

// Вызов хука и передача аргументов
Hook::call('another.hook',['a', 100], 
    function($return){
        echo 'Хук вернул значение: ';
        var_dump($return);
    },

    function($e){
        echo 'Хук вернул ошибку: ';
        var_dump($e);   
});

Список хуков

App

Хуки, связанные с работой приложения

app.init

Инициализация приложения, происходит после инициализации всех плагинов, но перед запуском роутера.
Хук НЕ запускается во время установки Хук подходит для переопределения путей у роутера
Подходит, например, для указания путей к шаблонам

Hook::registerOnce('app.init', function(){
    TemplateRoot::add('index', __DIR__ . DS . 'template' . DS . 'index');
});

app.install

Вызов хука происходит до инициализации процесса установки.

app.installed

Вызов хука происходит после завершения установки приложения, после установки всех плагинов.
При вызове хука происходит импорт файлов install.sql из корневых директорий плагинов (при активном плагине database).
При активном плагине user происходит создание учётной записи администратора с данными admin:admin
Подходит для установки заданий планировщика.

app.error

Ошибка (исключение), непойманное во время работы приложения Например, подходит для перехвата 404 ошибки Можно переопределить контроллер ошибки - $controller

Hook::registerOnce('app.error', function(BaseException $e, ErrorController $controller){
});

Plugin

Хуки, связанные с работой плагинов

plugin.install

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

/**
 * @return (array) Массив с параметрами, которые необходимо указать в процессе установки
 */
Hook::registerOnce('plugin.install', function(){
    // Можно указать плагины, от которых зависит текущий плагин
    Plugins::required('cache', 'crypto', 'database');

    // Также можно указать плагины, с которыми возможен конфликт работы
    Plugins::conflict('smsc');
    
    // Указываем поля, которые необходимо заполнить во время установки
    return [
        // Подробнее см. страницу с описанием процесса установки
    ];
});

Router

router

Позволяет вызвать определенный контроллер для определенного URI

/**
 * @param string $httpMethod GET | POST | PUT | DELETE
 * @param string $requestUri
 * @return AbstractController | null
 */
Hook::register('router', function(string $httpMethod, string $requestUri){
    if($httpMethod == "GET" && $requestUri == "/index"){
        return new MyIndexController;
    }
});

Menu

Хуки, позволяющие добавить либо изменить пункты меню

menu.render.dashboard-top

Верхнее меню Dashboard
param string $method

/**
 * @param MenuItem $menu
 */
Hook::register('menu.render.dashboard-top', function(MenuItem $menu){
    $menu->add(new MenuItem('Элемент меню', ['url' => Http::makeURI('/dashboard/url'), 'fa' => 'user', 'access' => UserAccess::getAccess('user.self')]), 0);
});

menu.render.dashboard-sidebar

Боковое меню пользователя

menu.render.dashboard-admin-sidebar

Боковое меню администратора


@todo

User

user.login

Авторизация пользователя

/**
 * @param SingleUser $user Пользователь, который авторизовывается
 */

user.register

Регистрация пользователя

/**
 * @param SingleUser $user Пользователь, который регистрируется
 */

Template

template.render

Dashboard

template.dashboard.config (Template $tpl)

Dashboard/User

template.dashboard.user.edit (Template $tpl, array &$configTabs = ['tabName' => 'tabContent'], int &$activeTab)

template.dashboard.user.profile (Template $tpl, SingleUser $user)

Dashboard / Auth

template.dashboard.auth (UIDashboardTabPanel $tabPane)

template.dashboard.auth.login

template.dashboard.auth.register

Dashboard / Blog

template.dashboard.post.edit (DashboardTemplate $tpl, ?Post $post, ?SingleUser $user)

Хук вызывается в шаблоне создания либо редактирования поста в блоге

/**
 * @param DashboardTemplate $tpl
 * @param Post $post | null
 * @param SingleUser $user| null
 */
Hook::register('template.dashboard.post.edit', function(DashboardTemplate $tpl, ?Post $post, ?SingleUser $user){

});

Referrer

referrer.invite (int $refId, SingleUser $user)

HTTP

http.send (string &$body, array &$headers, int $code, string $type)