應(yīng)用插件
每個應(yīng)用插件是一個完整的應(yīng)用,源碼放置于{主項(xiàng)目}/plugin
目錄下
提示
使用命令php webman app-plugin:create {插件名}
可以在本地創(chuàng)建一個應(yīng)用插件,
例如php webman app-plugin:create cms
將創(chuàng)建如下目錄結(jié)構(gòu)
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
我們看到一個應(yīng)用插件有著與webman相同的目錄結(jié)構(gòu)及配置文件。實(shí)際上開發(fā)一個應(yīng)用插件與開發(fā)一個webman項(xiàng)目體驗(yàn)基本一致,只需要注意以下幾個方面。
命名空間
插件目錄及命名遵循PSR4規(guī)范,因?yàn)椴寮挤胖糜趐lugin目錄下,所以命名空間都以plugin開頭,例如plugin\cms\app\controller\UserController
,這里cms是插件的源碼主目錄。
url訪問
應(yīng)用插件url地址路徑都以/app
開頭,例如plugin\cms\app\controller\UserController
url地址是 http://127.0.0.1:8787/app/cms/user
。
靜態(tài)文件
靜態(tài)文件放置于plugin/{插件}/public
下,例如訪問http://127.0.0.1:8787/app/cms/avatar.png
實(shí)際上是獲取plugin/cms/public/avatar.png
文件。
配置文件
插件的配置與普通webman項(xiàng)目一樣,不過插件的配置一般只對當(dāng)前插件有效,對主項(xiàng)目一般無影響。
例如plugin.cms.app.controller_suffix
的值只影響插件的控制器后綴,對主項(xiàng)目沒有影響。
例如plugin.cms.app.controller_reuse
的值只影響插件是否復(fù)用控制器,對主項(xiàng)目沒有影響。
例如plugin.cms.middleware
的值只影響插件的中間件,對主項(xiàng)目沒有影響。
例如plugin.cms.view
的值只影響插件所使用的視圖,對主項(xiàng)目沒有影響。
例如plugin.cms.container
的值只影響插件所使用的容器,對主項(xiàng)目沒有影響。
例如plugin.cms.exception
的值只影響插件的異常處理類,對主項(xiàng)目沒有影響。
但是因?yàn)槁酚墒侨值模圆寮渲玫穆酚梢彩怯绊懭值摹?/p>
獲取配置
獲取某個插件配置方法為 config('plugin.{插件}.{具體的配置}');
,例如獲取plugin/cms/config/app.php
的所有配置方法為config('plugin.cms.app')
同樣的,主項(xiàng)目或者其它插件都可以用config('plugin.cms.xxx')
來獲取cms插件的配置。
不支持的配置
應(yīng)用插件不支持server.php,session.php配置,不支持app.request_class
,app.public_path
,app.runtime_path
配置。
數(shù)據(jù)庫
插件可以配置自己的數(shù)據(jù)庫,例如plugin/cms/config/database.php
內(nèi)容如下
return [
'default' => 'mysql',
'connections' => [
'mysql' => [ // mysql為連接名
'driver' => 'mysql',
'host' => '127.0.0.1',
'port' => 3306,
'database' => '數(shù)據(jù)庫',
'username' => '用戶名',
'password' => '密碼',
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_general_ci',
],
'admin' => [ // admin為連接名
'driver' => 'mysql',
'host' => '127.0.0.1',
'port' => 3306,
'database' => '數(shù)據(jù)庫',
'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();
如果想使用主項(xiàng)目的數(shù)據(jù)庫,則直接使用即可,例如
use support\Db;
Db::table('user')->first();
// 假設(shè)主項(xiàng)目還配置了一個admin連接
Db::connection('admin')->table('admin')->first();
提示
thinkorm也是類似的用法
Redis
Redis用法與數(shù)據(jù)庫類似,例如 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');
同樣的,如果想復(fù)用主項(xiàng)目的Redis配置
use support\Redis;
Redis::get('key');
// 假設(shè)主項(xiàng)目還配置了一個cache連接
Redis::connection('cache')->get('key');
日志
日志類用法也與數(shù)據(jù)庫用法類似
use support\Log;
Log::channel('plugin.admin.default')->info('test');
如果想復(fù)用主項(xiàng)目的日志配置,直接使用
use support\Log;
Log::info('日志內(nèi)容');
// 假設(shè)主項(xiàng)目有個test日志配置
Log::channel('test')->info('日志內(nèi)容');
應(yīng)用插件安裝與卸載
應(yīng)用插件安裝時只需要將插件目錄拷貝到{主項(xiàng)目}/plugin
目錄下即可,需要reload或restart才能生效。
卸載時直接刪除{主項(xiàng)目}/plugin
下對應(yīng)的插件目錄即可。