插件规范
本章节主要是介绍,ShopWind系统插件的开发规范,比如支付插件、登录插件、物流插件等。
一、文件部署
插件对于应用(站点)来说,是全局通用的,比如支付插件、短信插件。所以我们的插件目录部署在公共目录common下,具体路径为: @shopwind/common/plugins
该目录下的每一个文件夹代表一个插件系列,插件系列文件夹下的每一个文件夹则代表了具体的一个插件。

另外,该目录下还有对应的插件系列基类插件基类 BasePlugin,每一个具体的插件,都首先继承自己的 插件系列基类,同时插件系列基类也继承至插件基类。

插件系列其实就是将插件进行分组,比如支付宝支付,微信支付属于支付插件系列payment;支付宝登录,微信登录等属于登录插件系列connect 进行分组后,我们更方便进行管理和调用。
一个简单的插件,实际上就是由主要的三个文件构成,我们以支付宝支付插件为例,具体说明下各个文件的用处,文件路径为@shopwind/common/plugins/payment/alipay
./alipay.plugin.php

插件主程序文件,负责业务逻辑的处理,插件文件的命名遵循插件文件夹.plugin.php的命名规范

,首字母不需要大写 ,但插件类的首字母必须大写,且继承至BasePayment类(注意: 如果是其他插件系列,则继承于对应的插件系列)。
./plugin.info.php

插件描述文件,定义插件的名称、挂件用途、开发者信息、版本号等。注意插件名code参数必须与插件文件夹名保持一致,该文件还有个最重要的作用就是 定义插件的参数,如APPID、秘钥等字段,方便在配置插件的时候,填写这些字段。

./SDK.php

该文件是非必须的,主要作用是编写接口SDK代码,现在很多接口对接,包括支付宝,微信支付等任何第三方支付,都会提供SDK,所以我们可以将相关的代码部署到该文件,然后给插件 主程序调用,这样的好处是,插件主程序将会变得很轻,一旦第三方接口SDK程序有更新,我们也只需要更新SDK.php文件即可。

二、插件配置项
通常我们使用的插件,都会有一个或多个配置项,用于跟第三方平台的签证对接,如支付插件需要配置APPID、秘钥等,短信插件需要配置短信秘钥,登录插件也需要配置APPID等 这些配置项,我们不可能写到代码里面,这样不利于修改,所以我们通常会根据接口要求设置这些配置项字段,然后通过后台的安装/配置插件的功能来实现填写参数值的目的。
插件配置项编写在plugin.info.php文件的config节点,其规范对于所有系列的插件来说,都是通用的。
'config'    => array(
    'appId'   => array(
        'text'  => 'appId',
        'desc'  => '应用APPID',
        'type'  => 'text',
    ),  
    ...
    'signType'  => array(   
        'text'      => '签名类型',
        'type'      => 'select',
        'items'     => array(
            'RSA2'   => 'RSA2',
            'RSA'    => 'RSA',
        ),
    )
)
config数组的键值key代表是配置项的字段名,text参数为字段显示名。 type参数是字段类型,目前只有两种形式,一种是文本类型text,第二种是下拉类型select 当为select类型时,必须配置下拉项items参数,如上面的signType
定义好了插件字段,我们在后台安装插件的时候,就可以提交保存这些字段的值,以便在插件中使用,插件的配置数据将保存到数据表plugin里。
三、使用插件
插件开发好之后,我们首先需要到后台 -> 插件 -> 安装填写插件配置项并选择启用插件,提交保存。然后我们就可以在任何位置使用它,如下例子所示,payment为插件系列名,alipay为具体插件名。
use common\library\Plugin;

// 获取支付宝支付支付插件实例
$alipay = Plugin::getInstance('payment')->build('alipay');

// 获取支付宝支付插件配置参数
$alipay->getConfig();

// 获取支付宝支付插件描述信息
$alipay->getInfo();

// 获取所有支付插件列表
$payments = Plugin::getInstance('payment')->getList();

// 检查某个插件是否已安装
$checkInstall = Plugin::getInstance('payment')->isInstall('alipay');

// 返回插件系列基类(即:所有支付插件的父类)
$plugin = Plugin::getInstance('payment')->build();
我们将插件实例类继承于插件系列基类,插件系列基类又继承于插件基类,在相关基类编写公共方法,将业务代码部署在插件主程序alipay.plugin.phpSDK.php 中,然后通过插件实例类Plugin::getInstance('payment')->build('alipay')调用即可。
具体实例插件开发,请参考:

支付插件开发实例:支付插件实例

短信插件开发实例:短信插件实例

登录插件开发实例:登录插件实例

物流插件开发实例:物流插件实例

OSS云存储开发实例:OSS云存储实例

编辑器插件开发实例:编辑器插件实例

文件上传插件开发实例:文件上传插件实例

所有插件实例都遵循本插件规范内容,建议大家在开发插件时,一定要熟读本文,最后多分析源码,多看实例。 只要掌握了插件的基本要点、基本规范,就可以快速的编写一个插件。
通过本节的学习,大家应该能掌握了插件的基本规范和用法,如果对此还有疑问,可以进入我们官方的 开发者社区反馈,我们会有官方技术人员在线解答。