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

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

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

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

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

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

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

### Файл plugin.properties

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

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

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

### Файл plugin.json

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

```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
<?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
<?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;
}
```

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

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

#### Хуки

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

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

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

#### Фильтры

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

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

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

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

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

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

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

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

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

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

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