Создание персонализированных событий

SDK API Plesk позволяет создавать персонализированные события, записывать их в Журнал Операций и присваивать им обработчики событий через Plesk и SDK API в расширениях.

Персонализированные события можно добавить с помощью хука ActionLog, который расширяет класс pm_Hook_ActionLog и находится в hooks/ActionLog.php. Публичный метод getEvents() должен возвращать массив пар "ключ-значение". В этом массиве ключи представляют собой уникальные (для этого расширения) идентификаторы событий, а значения - названия событий. Чтобы предотвратить конфликты идентификаторов, мы добавляем префикс 'ext_my-extension_' к каждому идентификатору. Чтобы такими событиями можно было управлять через SDK API, идентификатор должен использоваться с префиксом. Например, имя вашего расширения может быть 'my-extension', а идентификатор события (в хуке) – 'smth_created'. В классе, прослушивающем события, вам необходимо зафиксировать действие 'ext_my-extension_smth_created'.

Новый класс pm_ActionLog был создан, чтобы обеспечить возможность запускать события (метод pm_ActionLog::submit()). Он имеет следующие аргументы:

  • actionId (обязательный) – уникальный идентификатор события, такой же, какой был указан в хуке.
  • objectId (необязательный) – параметр, передающий идентификатор объекта для контекста (type: integer).
  • oldValue (необязательный) – параметр для контекста, показывающий некоторые изменения.
  • newValue (необязательный) – параметр для контекста, показывающий некоторые изменения.

Обработчики событий также можно добавить в Plesk (Инструменты и настройки => Менеджер событий).

Эти обработчики событий хранятся в настройках расширения (pm_Settings) в формате JSON. Обработчики событий автоматически удаляются при удалении расширения.

Примеры

Добавление персонализированного события с помощью хука

class Modules_MyExtension_ActionLog extends pm_Hook_ActionLog
{
 public function getEvents()
 {
 return [
 'smth_created' => 'Something created',
 ];
 }
}

Добавление события в Журнал Операций

/* Метод в вашем контроллере */
public function addAction()
{
 $form = new AddSmthForm(['context' => [
 // передача некоторых переменных для контекста
 ]]);
 
 if ($this->getRequest()->isPost() && $form->isValid($this->getRequest()->getPost())) {
 $status = 'success';
 $message = 'OK';
 try {
 $objectId = $form->processForm(); // Предполагаем, что обработка формы возвращает вновь созданный идентификатор объекта
 
 // Добавляем событие в Журнал Операций
 pm_ActionLog::submit('smth_created', $objectId, 'old value', 'new value');
 
 } catch (pm_Exception $e) {
 $status = 'error';
 $message = $e->getMessage();
 }
 $this->_redirectWithStatus($status, $message, $this->getRedirectUrl());
 }
 $this->view->form = $form;
}

Управление событием через SDK API

class Modules_MyExtension_EventListener implements EventListener
{
 public function handleEvent($objectType, $objectId, $action, $oldValue, $newValue)
 {
 if ($action == 'ext_myextension_smth_created') {
 pm_Log::info('Handle event: ext_myextension_smth_created');
 pm_Log::info('Object Id: ' . var_export($objectId, true));
 pm_Log::info('Old value: ' . var_export($oldValue, true));
 pm_Log::info('New value: ' . var_export($newValue, true));
 }
 }
}
 
return new Modules_MyExtension_EventListener();