基礎(chǔ)插件生成及發(fā)布流程
原理
1、以跨域插件為例,插件分為三部分,一個是跨域中間件程序文件,一個是中間件配置文件middleware.php,還有一個是通過命令自動生成的Install.php。
2、我們使用命令將三個文件打包并發(fā)布到composer。
3、當(dāng)用戶使用composer安裝跨域插件時,插件中的Install.php會將跨域中間件程序文件以及配置文件拷貝到{主項目}/config/plugin
下,讓webman加載。實現(xiàn)了跨域中間件文件自動配置生效。
4、當(dāng)用戶使用composer刪除該插件時,Install.php會刪除相應(yīng)的跨域中間件程序文件和配置文件,實現(xiàn)插件自動卸載。
規(guī)范
1、插件名由兩部分組成,廠商
和插件名
,例如 webman/push
,這個與composer包名對應(yīng)。
2、插件配置文件統(tǒng)一放在 config/plugin/廠商/插件名/
下(console命令會自動創(chuàng)建配置目錄)。如果插件不需要配置,則需要刪除自動創(chuàng)建的配置目錄。
3、插件配置目錄僅支持 app.php插件主配置,bootstrap.php 進(jìn)程啟動配置,route.php 路由配置,middleware.php 中間件配置,process.php 自定義進(jìn)程配置,database.php數(shù)據(jù)庫配置,redis.php redis配置,thinkorm.php thinkorm配置。這些配置會自動被webman識別。
4、插件使用以下方法獲取配置config('plugin.廠商.插件名.配置文件.具體配置項');
,例如config('plugin.webman.push.app.app_key')
5、插件如果有自己的數(shù)據(jù)庫配置,則通過以下方式訪問。illuminate/database
為Db::connection('plugin.廠商.插件名.具體的連接')
,thinkrom
為Db::connct('plugin.廠商.插件名.具體的連接')
6、如果插件需要在app/
目錄下放置業(yè)務(wù)文件,需要確保不與用戶項目以及其它插件沖突。
7、插件應(yīng)該盡量避免向主項目拷貝文件或目錄,例如跨域插件除了配置文件需要拷貝到主項目,中間件文件應(yīng)該放在vendor/webman/cros/src
下,不必拷貝到主項目。
8、插件命名空間建議使用大寫,例如 Webman/Console。
示例
安裝webman/console
命令行
composer require webman/console
創(chuàng)建插件
假設(shè)創(chuàng)建的插件名字叫 foo/admin
(名稱也就是后面composer要發(fā)布的項目名,名稱需要小寫)
運行命令
php webman plugin:create --name=foo/admin
創(chuàng)建插件后會生成目錄 vendor/foo/admin
用于存放插件相關(guān)文件 和 config/plugin/foo/admin
用于存放插件相關(guān)配置。
注意
config/plugin/foo/admin
支持以下配置,app.php插件主配置,bootstrap.php 進(jìn)程啟動配置,route.php 路由配置,middleware.php 中間件配置,process.php 自定義進(jìn)程配置,database.php數(shù)據(jù)庫配置,redis.php redis配置,thinkorm.php thinkorm配置。配置格式與webman相同,這些配置會自動被webman識別合并到配置當(dāng)中。
使用時以plugin
為前綴訪問,例如 config('plugin.foo.admin.app');
導(dǎo)出插件
當(dāng)我們開發(fā)完插件后,執(zhí)行以下命令導(dǎo)出插件
php webman plugin:export --name=foo/admin
導(dǎo)出
說明
導(dǎo)出后會將config/plugin/foo/admin目錄拷貝到vendor/foo/admin/src下,同時自動生成一個Install.php,Install.php用于自動安裝和自動卸載時執(zhí)行一些操作。
安裝默認(rèn)操作是將 vendor/foo/admin/src 下的配置拷貝到當(dāng)前項目config/plugin下
移除時默認(rèn)操作是將 當(dāng)前項目config/plugin 下的配置文件刪除
你可以修改Install.php以便在安裝和卸載插件時做一些自定義操作。
提交插件
- 假設(shè)你已經(jīng)有 github 和 packagist 賬號
- 在github上創(chuàng)建一個admin項目并將代碼上傳,項目地址假設(shè)是
https://github.com/你的用戶名/admin
- 進(jìn)入地址
https://github.com/你的用戶名/admin/releases/new
發(fā)布一個release如v1.0.0
- 進(jìn)入packagist點擊導(dǎo)航里
Submit
,將你的github項目地址https://github.com/你的用戶名/admin
提交上去這樣就完成了一個插件的發(fā)布
提示
如果在packagist
里提交插件顯示字沖突,可以重新取一個廠商的名字,比如foo/admin
改成myfoo/admin
后續(xù)當(dāng)你的插件項目代碼有更新時,需要將代碼同步到github,并再次進(jìn)入地址https://github.com/你的用戶名/admin/releases/new
重新發(fā)布一個release,然后到 https://packagist.org/packages/foo/admin
頁面點擊 Update
按鈕更新版本
給插件添加命令
有時候我們的插件需要一些自定義命令來提供一些輔助功能,例如安裝 webman/redis-queue
插件后,項目將會自動增加一個redis-queue:consumer
命令,用戶只要運行 php webman redis-queue:consumer send-mail
就會在項目里生成一個SendMail.php的消費者類,這樣有助于快速開發(fā)。
假設(shè)foo/admin
插件需要添加foo-admin:add
命令,參考如下步驟。
新建命令
新建命令文件 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;
}
}
注意
為了避免插件間命令沖突,命令行格式建議為廠商-插件名:具體命令
,例如foo/admin
插件的所有命令都應(yīng)該以foo-admin:
為前綴,例如foo-admin:add
。
增加配置
新建配置 config/plugin/foo/admin/command.php
<?php
use Foo\Admin\FooAdminAddCommand;
return [
FooAdminAddCommand::class,
// ....可以添加多個配置...
];
提示
command.php
用于給插件配置自定義命令,數(shù)組中每個元素對應(yīng)一個命令行類文件,每個類文件對應(yīng)一個命令。當(dāng)用戶運行命令行時webman/console
會自動加載每個插件command.php
里設(shè)置的自定義命令。 想了解更多命令行相關(guān)請參考命令行
執(zhí)行導(dǎo)出
執(zhí)行命令 php webman plugin:export --name=foo/admin
導(dǎo)出插件,并提交到packagist
。這樣用戶安裝 foo/admin
插件后,就會增加一個 foo-admin:add
命令。執(zhí)行 php webman foo-admin:add jerry
將打印 Admin add jerry