Система плагинов

Эта документация описывает систему плагинов, реализованную в приложении.

Общая информация

Система плагинов позволяет расширять функциональность приложения без изменения его исходного кода. Плагины могут добавлять новые возможности, изменять поведение существующих функций и взаимодействовать с другими плагинами.

Структура плагина

Каждый плагин должен иметь следующую структуру:

plugins/
  ├── ИмяПлагина/
  │   ├── plugin.properties    # Файл свойств плагина (для нового способа)
  │   ├── plugin.json          # Файл конфигурации плагина
  │   ├── plugin.php           # Файл инициализации плагина (для старого способа)
  │   └── src/                 # Директория с исходным кодом плагина
  │       └── ...              # Классы плагина

Файл plugin.properties

Файл plugin.properties содержит основные свойства плагина, включая имя главного класса:

mainClass=namespace\\ИмяГлавногоКласса

Главный класс плагина должен наследоваться от fs\AbstractPlugin и реализовывать метод init().

Файл plugin.json

Файл plugin.json содержит метаданные плагина:

{
    "name": "ИмяПлагина",
    "version": "1.0.0",
    "description": "Описание плагина",
    "author": "Автор плагина",
    "requires": ["ЗависимыйПлагин1", "ЗависимыйПлагин2"],
    "settings": {
        "enabled": true,
        "debug": false
    }
}

Создание плагина (новый способ)

  1. Создайте директорию для плагина в папке plugins/.

  2. Создайте файл plugin.properties с указанием главного класса.

  3. Создайте файл plugin.json с метаданными плагина.

  4. Создайте директорию src/ для исходного кода плагина.

  5. Создайте главный класс плагина, наследующийся от fs\AbstractPlugin.

Пример главного класса плагина:

<?php
namespace MyPlugin;

use fs\AbstractPlugin;

class MyPlugin extends AbstractPlugin {
    /**
     * Инициализация плагина
     */
    public function init() {
        // Регистрируем хуки
        $this->addHook('app.init', [$this, 'onAppInit']);
        $this->addHook('app.shutdown', [$this, 'onAppShutdown']);
    }
    
    /**
     * Обработчик события инициализации приложения
     */
    public function onAppInit() {
        echo "Плагин {$this->getName()} инициализирован!\n";
    }
    
    /**
     * Обработчик события завершения работы приложения
     */
    public function onAppShutdown() {
        echo "Плагин {$this->getName()} завершает работу!\n";
    }
}

Создание плагина (старый способ)

  1. Создайте директорию для плагина в папке plugins/.

  2. Создайте файл plugin.json с метаданными плагина.

  3. Создайте файл plugin.php с функцией инициализации плагина.

Пример файла plugin.php:

<?php
/**
 * Функция инициализации плагина
 * 
 * @param \fs\PluginManager $manager Менеджер плагинов
 * @param string $pluginDir Директория плагина
 * @return object Объект плагина
 */
function init_myplugin($manager, $pluginDir) {
    // Создаем объект плагина
    $plugin = new stdClass();
    $plugin->name = 'MyPlugin';
    $plugin->version = '1.0.0';
    $plugin->description = 'Мой плагин';
    $plugin->author = 'Автор';
    
    // Регистрируем хуки
    $manager->addHook('app.init', function() use ($plugin) {
        echo "Плагин {$plugin->name} инициализирован!\n";
        return true;
    });
    
    $manager->addHook('app.shutdown', function() use ($plugin) {
        echo "Плагин {$plugin->name} завершает работу!\n";
        return true;
    });
    
    return $plugin;
}

Хуки и фильтры

Система плагинов поддерживает хуки и фильтры для расширения функциональности:

Хуки

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

// Регистрация хука
$this->addHook('hook.name', function($arg1, $arg2) {
    // Код обработчика
    return $result;
});

// Вызов хука
$result = $this->doHook('hook.name', [$arg1, $arg2]);

Фильтры

Фильтры позволяют изменять данные:

// Регистрация фильтра
$this->addHook('filter.name', function($value, $arg1, $arg2) {
    // Изменяем значение
    return $modifiedValue;
});

// Применение фильтра
$filteredValue = $this->applyFilter('filter.name', $value, [$arg1, $arg2]);

Зависимости плагинов

Плагины могут зависеть от других плагинов. Зависимости указываются в файле plugin.json в поле requires:

{
    "requires": ["ЗависимыйПлагин1", "ЗависимыйПлагин2"]
}

Система плагинов автоматически загружает зависимости перед загрузкой плагина.

Настройки плагинов

Плагины могут иметь настройки, которые указываются в файле plugin.json в поле settings:

{
    "settings": {
        "enabled": true,
        "debug": false
    }
}

Настройки доступны через методы getSettings(), getSetting() и setSetting() класса AbstractPlugin.

Last updated