Плагины приложений
Каждый плагин приложения является полноценным приложением, исходный код которого размещается в директории {главный проект}/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
.