Базовый процесс создания и публикации плагина
Принцип
- На примере cross-origin плагина: плагин состоит из трёх частей — файл middleware cross-origin, файл конфигурации
middleware.phpи автоматически создаваемый командойInstall.php. - Команда используется для упаковки этих трёх файлов и публикации через Composer.
- При установке плагина cross-origin через Composer,
Install.phpкопирует файл middleware и конфигурацию в{основной проект}/config/pluginдля загрузки webman, включая таким образом cross-origin. - При удалении плагина через Composer,
Install.phpудаляет соответствующие файлы middleware и конфигурации, выполняя автоматическую деинсталляцию плагина.
Спецификация
- Имя плагина состоит из
vendorиимени плагина, напр.webman/push, что соответствует имени пакета Composer. - Файлы конфигурации плагина размещаются в
config/plugin/vendor/имя плагина/(команда консоли создаёт каталог конфигурации автоматически). Если плагину не нужна конфигурация, созданный каталог следует удалить. - Каталог конфигурации плагина поддерживает только:
app.php(основная конфигурация),bootstrap.php(запуск процессов),route.php(маршруты),middleware.php(middleware),process.php(пользовательские процессы),database.php(БД),redis.php(Redis),thinkorm.php(thinkorm). Они распознаются webman автоматически. - Доступ к конфигурации:
config('plugin.vendor.имя плагина.файл конфига.конкретный пункт');, напр.config('plugin.webman.push.app.app_key'). - При собственной конфигурации БД: для
illuminate/databaseиспользоватьDb::connection('plugin.vendor.имя плагина.подключение'), дляthinkorm—Db::connect('plugin.vendor.имя плагина.подключение'). - При размещении бизнес-файлов в
app/плагин не должен конфликтовать с основным проектом и другими плагинами. - Плагинам следует избегать копирования файлов или каталогов в основной проект. Напр., для cross-origin плагина копируется только конфигурация; файлы middleware остаются в
vendor/webman/cros/src. - Для пространств имён плагинов рекомендуется PascalCase, напр.
Webman/Console.
Пример
Установить командную строку webman/console
composer require webman/console
Создание плагина
Предположим, создаётся плагин с именем foo/admin (имя проекта Composer для публикации, в нижнем регистре). Выполнить:
php webman plugin:create --name=foo/admin
Создаются vendor/foo/admin (файлы плагина) и config/plugin/foo/admin (конфигурация).
Примечание
config/plugin/foo/adminподдерживает:app.php,bootstrap.php,route.php,middleware.php,process.php,database.php,redis.php,thinkorm.php. Формат как у webman, автоматическое слияние.
Доступ с префиксомplugin, напр.config('plugin.foo.admin.app').
Экспорт плагина
После завершения разработки выполнить:
php webman plugin:export --name=foo/admin
Экспорт
Пояснение
При экспортеconfig/plugin/foo/adminкопируется вvendor/foo/admin/srcи создаётсяInstall.php, выполняемый при установке и удалении.
Установка по умолчанию: копирует конфигурацию изvendor/foo/admin/srcвconfig/pluginпроекта.
Удаление по умолчанию: удаляет файлы конфигурации плагина изconfig/pluginпроекта.
Можно изменитьInstall.phpдля добавления своей логики при установке и удалении.
Публикация плагина
- Предполагается, что есть аккаунты GitHub и Packagist.
- Создать репозиторий
adminна GitHub и загрузить код, напр.https://github.com/ваш-username/admin. - Перейти на
https://github.com/ваш-username/admin/releases/newи создать релиз, напр.v1.0.0. - На Packagist нажать
Submitи указатьhttps://github.com/ваш-username/adminдля публикации плагина.
Подсказка
При конфликте имён на Packagist выбрать другое имя vendor, напр. изменитьfoo/adminнаmyfoo/admin.
При обновлении: загрузить код на GitHub, создать новый релиз на https://github.com/ваш-username/admin/releases/new, затем нажать Update на https://packagist.org/packages/foo/admin.
Добавление команд к плагину
Некоторым плагинам нужны свои команды. Напр., при установке webman/redis-queue проект получает команду redis-queue:consumer. Команда php webman redis-queue:consumer send-mail быстро генерирует класс consumer SendMail.php, что ускоряет разработку.
Чтобы добавить команду foo-admin:add к плагину foo/admin:
Создание команды
Создать файл vendor/foo/admin/src/FooAdminAddCommand.php
<?php
namespace Foo\Admin;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument;
class FooAdminAddCommand extends Command
{
protected static $defaultName = 'foo-admin:add';
protected static $defaultDescription = 'Описание команды';
/**
* @return void
*/
protected function configure()
{
$this->addArgument('name', InputArgument::REQUIRED, 'Add name');
}
/**
* @param InputInterface $input
* @param OutputInterface $output
* @return int
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
$name = $input->getArgument('name');
$output->writeln("Admin add $name");
return self::SUCCESS;
}
}
Примечание
Чтобы избежать конфликтов команд между плагинами, использовать форматvendor-plugin:команда. Напр., все команды плагинаfoo/adminдолжны иметь префиксfoo-admin:, напримерfoo-admin:add.
Добавление конфигурации
Создать config/plugin/foo/admin/command.php
<?php
use Foo\Admin\FooAdminAddCommand;
return [
FooAdminAddCommand::class,
// Добавить другие при необходимости...
];
Подсказка
command.phpрегистрирует пользовательские команды плагина. Каждая запись — класс команды.webman/consoleзагружает их автоматически. См. Команды консоли.
Выполнение экспорта
Выполнить php webman plugin:export --name=foo/admin для экспорта и публикации на Packagist. После установки foo/admin будет доступна команда foo-admin:add. Команда php webman foo-admin:add jerry выведет Admin add jerry.