-
Notifications
You must be signed in to change notification settings - Fork 0
Hooks
Функционал хуков описан в файле 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);
});
Хуки, связанные с работой приложения
Инициализация приложения, происходит после инициализации всех плагинов, но перед запуском роутера.
Хук НЕ запускается во время установки Хук подходит для переопределения путей у роутера
Подходит, например, для указания путей к шаблонам
Hook::registerOnce('app.init', function(){
TemplateRoot::add('index', __DIR__ . DS . 'template' . DS . 'index');
});
Вызов хука происходит до инициализации процесса установки.
Вызов хука происходит после завершения установки приложения, после установки всех плагинов.
При вызове хука происходит импорт файлов install.sql из корневых директорий плагинов (при активном плагине database).
При активном плагине user происходит создание учётной записи администратора с данными admin:admin
Подходит для установки заданий планировщика.
Ошибка (исключение), непойманное во время работы приложения Например, подходит для перехвата 404 ошибки Можно переопределить контроллер ошибки -
$controller
Hook::registerOnce('app.error', function(BaseException $e, ErrorController $controller){
});
Хуки, связанные с работой плагинов
Установка плагина, вызывается в процессе установки системы. Можно указать параметры, которые необходимо будет заполнить во время установки приложения, подробнее см. процесс установки.
/**
* @return (array) Массив с параметрами, которые необходимо указать в процессе установки
*/
Hook::registerOnce('plugin.install', function(){
// Можно указать плагины, от которых зависит текущий плагин
Plugins::required('cache', 'crypto', 'database');
// Также можно указать плагины, с которыми возможен конфликт работы
Plugins::conflict('smsc');
// Указываем поля, которые необходимо заполнить во время установки
return [
// Подробнее см. страницу с описанием процесса установки
];
});
Позволяет вызвать определенный контроллер для определенного 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;
}
});
Хуки, позволяющие добавить либо изменить пункты меню
Верхнее меню 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);
});
Боковое меню пользователя
Боковое меню администратора
@todo
Авторизация пользователя
/**
* @param SingleUser $user Пользователь, который авторизовывается
*/
Регистрация пользователя
/**
* @param SingleUser $user Пользователь, который регистрируется
*/
template.dashboard.user.edit (Template $tpl, array &$configTabs = ['tabName' => 'tabContent'], int &$activeTab)
Хук вызывается в шаблоне создания либо редактирования поста в блоге
/**
* @param DashboardTemplate $tpl
* @param Post $post | null
* @param SingleUser $user| null
*/
Hook::register('template.dashboard.post.edit', function(DashboardTemplate $tpl, ?Post $post, ?SingleUser $user){
});