QStack所有插件都是存储在项目根目录qstack
下的addons
目录,一个插件一个目录,目录名必须和插件标识相同。
demo_addon //插件标识(示例插件),全小写,单词以下划线分割,尽量使用专有名词,以避免冲突。
| —- root //存放源代码目录
| —- config.html //插件配置项
| —- config.php //插件配置项属性
| —- db_schema.json //数据库配置
| —-DemoAddon.php // 插件安装与卸载
| —- info.ini //插件信息配置
<ul>
<li>
<span>Arg1</span>
<div class="qg-text-item">
<input type="text" name="arg1" value="{$config.arg1}">
</div>
</li>
</ul>
<?php
return array (
'ad_monitor_validity' => '30',
);
{
"demo_addon": {
"tableName": "demo_addon",
"columns": {
"id": {
"name": "id",
"dataType": "int",
"type": "int(11)",
"columnDefault": null,
"isNullable": false,
"autoIncrement": true
},
"value_old": {
"name": "value_old",
"dataType": "varchar",
"type": "varchar(255)",
"columnDefault": null,
"isNullable": true,
"autoIncrement": false
},
"value": {
"name": "value",
"dataType": "int",
"type": "int(11)",
"columnDefault": null,
"isNullable": true,
"autoIncrement": false
}
},
"primaryKeys": [
"id"
],
"uniqueIndexs": []
}
}
<?php
namespace demo_addon;
use app\common\contracts\addon\ConfigureValidator;
use Exception;
use think\facade\Db;
class DemoAddon implements ConfigureValidator
{
// 插件安装 v1版本
public function install($current_version = null)
{
Db::name('demo_addon')->insertAll([
['value' => 1, 'value_old' => 'demo_addon_database_value-1'],
['value' => 2, 'value_old' => 'demo_addon_database_value-2']
]);
$this->install_v3($current_version);
}
// 插件卸载
public function uninstall()
{
Db::execute('drop table demo_addon');
}
// 插件配置项验证
public function configureValidate(array $configure)
{
if (!$configure['arg1']) {
throw new Exception("请填写 arg1");
}
}
// 插件升级
public function upgrade()
{
//do something;
}
}
name = demo_addon #插件标识
title = 示例插件 #插件名称
intro = 示例插件 #插件描述
author = xxx #插件作者
version = 1.1 #插件版本
这种类型的插件可以不需要依赖于系统其它部分模块而独立存在,可直接将源代码如demo_addons目录下的代码拷贝到项目根目录qstack下的addons目录,插件被安装时,demo_addons/root 目录中的文件会被逐一被拷贝并替换项目qstack目录中对应的文件,如前面demo_addon这个插件就是这种集成的方式。
这种类型的插件需要依赖于原系统的模块而存在,如广告监控的钩子,现在需要在原系统用户注册的时候插入对应的访客记录,原系统已存在钩子VisitorToUserHook,该接口有个hookVisitorToUser方法,用户只需要在所定义的插件类AdMonitor实现这个方法,系统在用户注册这个环节会自动调用这个钩子的方法,实现用户所需要的功能。新增支付方式、短信通道、邮件通道皆可采用此方式。
<?php
namespace ad_monitor;
use app\common\contracts\addon\ConfigureValidator;
use Exception;
use think\facade\Db;
// 广告监控插件类
class AdMonitor implements ConfigureValidator,VisitorToUserHook
{
// 插件安装
public function install($current_version = null)
{
//do something;
}
// 插件卸载
public function uninstall()
{
//do something;
}
// 插件配置项验证
public function configureValidate(array $configure)
{
//do something;
}
// 插件升级
public function upgrade()
{
//do something;
}
// 注册用户增加访客记录
public function hookVisitorToUser(int $userId)
{
AdMonitorModel::conversionUser($userId);
}
}
你可以在你需要调用插件钩子的地方执行execHook,如广告监控插件,在注册控制器RegisterController.class.php文件中埋入对应的钩子
class RegisterController extends HomeController
{
private $userSession;
public function _initialize()
public function doRegister()
{
// do someing
if($result){ // 注册成功
Addon::execHook(VisitorToUser::class, (int)$flg['result']); //调用钩子,传入对应的参数,系统会自动调用插件实现的方法
}
}
}