Плагины приложений

Каждый плагин приложения является полноценным приложением, исходный код которого размещается в директории {главный проект}/plugin.

Подсказка
Используя команду php webman app-plugin:create {имя плагина}, вы можете создать плагин приложения на локальном компьютере,
например, команда php webman app-plugin:create cms создаст следующую структуру каталогов:

plugin/
└── cms
    ├── app
    │   ├── controller
    │   │   └── IndexController.php
    │   ├── exception
    │   │   └── Handler.php
    │   ├── functions.php
    │   ├── middleware
    │   ├── model
    │   └── view
    │       └── index
    │           └── index.html
    ├── config
    │   ├── app.php
    │   ├── autoload.php
    │   ├── container.php
    │   ├── database.php
    │   ├── exception.php
    │   ├── log.php
    │   ├── middleware.php
    │   ├── process.php
    │   ├── redis.php
    │   ├── route.php
    │   ├── static.php
    │   ├── thinkorm.php
    │   ├── translation.php
    │   └── view.php
    └── public

Мы видим, что плагин приложения имеет такую же структуру каталогов и конфигурационные файлы, как и webman. На самом деле, разработка плагина приложения имеет практически такой же опыт, как разработка проекта webman, нужно только обратить внимание на следующие аспекты.

Пространство имен

Структура каталогов плагина и наименования соблюдают стандарт PSR4, так как плагины располагаются в директории plugin, пространства имен начинаются с plugin, например, plugin\cms\app\controller\UserController, здесь cms — это основная директория исходного кода плагина.

URL доступ

URL адреса плагина приложения начинаются с /app, например, для plugin\cms\app\controller\UserController URL адрес будет http://127.0.0.1:8787/app/cms/user.

Статические файлы

Статические файлы располагаются в plugin/{плагин}/public, например, доступ к http://127.0.0.1:8787/app/cms/avatar.png фактически соответствует получению файла plugin/cms/public/avatar.png.

Конфигурационные файлы

Конфигурация плагинов аналогична обычному проекту webman, однако конфигурация плагина обычно действует только для текущего плагина и не влияет на главный проект.
Например, значение plugin.cms.app.controller_suffix влияет только на суффикс контроллера плагина и не затрагивает главный проект.
Значение plugin.cms.app.controller_reuse влияет только на то, повторно используется ли контроллер плагина, и не влияет на главный проект.
Значение plugin.cms.middleware влияет только на промежуточное ПО плагина и не затрагивает главный проект.
Значение plugin.cms.view влияет только на представление, используемое плагином, и не влияет на главный проект.
Значение plugin.cms.container влияет только на контейнер, используемый плагином, и не имеет значения для главного проекта.
Значение plugin.cms.exception влияет только на класс обработки исключений плагина и не затрагивает главный проект.

Однако, так как маршруты являются глобальными, маршруты, настроенные в конфигурации плагина, также влияют на глобальное поведение.

Получение конфигурации

Метод получения конфигурации конкретного плагина: config('plugin.{плагин}.{конкретная конфигурация}');, например, чтобы получить все конфигурации из plugin/cms/config/app.php, используйте config('plugin.cms.app').
Аналогично, главный проект или другие плагины также могут получить конфигурацию плагина cms с помощью config('plugin.cms.xxx').

Неподдерживаемые конфигурации

Плагины приложений не поддерживают конфигурацию server.php, session.php, не поддерживают app.request_class, app.public_path и app.runtime_path.

База данных

Плагины могут настраивать свои собственные базы данных, например, содержимое plugin/cms/config/database.php выглядит следующим образом:

return  [
    'default' => 'mysql',
    'connections' => [
        'mysql' => [ // mysql — это имя соединения
            'driver'      => 'mysql',
            'host'        => '127.0.0.1',
            'port'        => 3306,
            'database'    => 'База данных',
            'username'    => 'Имя пользователя',
            'password'    => 'Пароль',
            'charset'     => 'utf8mb4',
            'collation'   => 'utf8mb4_general_ci',
        ],
        'admin' => [ // admin — это имя соединения
            'driver'      => 'mysql',
            'host'        => '127.0.0.1',
            'port'        => 3306,
            'database'    => 'База данных',
            'username'    => 'Имя пользователя',
            'password'    => 'Пароль',
            'charset'     => 'utf8mb4',
            'collation'   => 'utf8mb4_general_ci',
        ],
    ],
];

Способ обращения: Db::connection('plugin.{плагин}.{имя соединения}');, например:

use support\Db;
Db::connection('plugin.cms.mysql')->table('user')->first();
Db::connection('plugin.cms.admin')->table('admin')->first();

Если вы хотите использовать базу данных главного проекта, просто используйте её как обычно, например:

use support\Db;
Db::table('user')->first();
// Предположим, что главный проект также настроил соединение admin
Db::connection('admin')->table('admin')->first();

Подсказка
Использование thinkorm также аналогично.

Redis

Использование Redis аналогично использованию базы данных, например, plugin/cms/config/redis.php:

return [
    'default' => [
        'host' => '127.0.0.1',
        'password' => null,
        'port' => 6379,
        'database' => 0,
    ],
    'cache' => [
        'host' => '127.0.0.1',
        'password' => null,
        'port' => 6379,
        'database' => 1,
    ],
];

Используйте так:

use support\Redis;
Redis::connection('plugin.cms.default')->get('key');
Redis::connection('plugin.cms.cache')->get('key');

Аналогично, если хотите повторно использовать конфигурацию Redis главного проекта:

use support\Redis;
Redis::get('key');
// Предположим, что главный проект также настроил соединение cache
Redis::connection('cache')->get('key');

Логи

Использование классов логирования также аналогично использованию баз данных:

use support\Log;
Log::channel('plugin.admin.default')->info('test');

Если хотите использовать конфигурацию логов главного проекта, просто используйте её:

use support\Log;
Log::info('Содержимое лога');
// Предположим, что главный проект имеет конфигурацию лога test
Log::channel('test')->info('Содержимое лога');

Установка и удаление плагинов приложений

При установке плагина приложения достаточно просто скопировать каталог плагина в директорию {главный проект}/plugin, после чего требуется выполнить reload или restart для применения изменений.
Чтобы удалить плагин, просто удалите соответствующий каталог плагина из {главный проект}/plugin.