**注意:服务器插件的本质是一个插件,因此可以被调用info和hook方法,但这两个方法已经由基类 NewIDC\Plugin\Server 实现,因此可不需要手动实现(除非有特殊需求)**
[TOC]
与一般插件不同,服务器插件需要继承 `NewIDC\Plugin\Server` 抽象类,并实现抽象方法并覆盖部分父类方法。服务器插件无需实现 `info` 和 `hook` 方法,但需要覆盖以下成员变量:
~~~php
protected $name; // 插件名
protected $composer; // 插件composer名
protected $version; // 插件版本
protected $description; // 插件描述
~~~
其中,`composer`和`version`任选一个,composer取得的版本会覆盖插件所设置的版本。
当然,如果需要挂钩,也可以重写`hook`方法。
以下是实现抽象方法和覆盖父类方法的指南,虽然阅读源码就可以得知如何开发,但是我觉得应该不会有几个人会去看的吧wwwwww。
# 成员变量
上面已经介绍了4个成员变量,现在再补充3个:
```php
protected $service; // 服务模型
protected $server; // 服务器模型
protected $product; // 产品模型
```
这三个模型来自NewIDC的源码,不包含在插件管理器中。
# 抽象方法
## 一些操作需要遵守的规则
activate、suspend、unsuspend、terminate、changePassword、upgradeDowngrade必须遵守以下规则:
1. 不可以修改`service`的status值
2. 返回值必须为以下格式:
~~~
['code'=>状态码(0为成功标准),'message'=>错误信息]
~~~
3. 原则上可以修改`extra`字段,但不得随意修改系统已占用的键名对应的键值;其他字段一般也不得修改
4. extra字段中系统占用的键名:
- suspend_reason
- auto_terminate_end_of_cycle
- auto_terminate_end_of_cycle_reason
5. 服务名称、用户名、密码原则上直接从`service`成员变量中获取,不得在插件中生成
## activate
服务激活时的操作
## suspend
服务暂停时的操作
## unsuspend
服务解除暂停时的操作
## terminate
服务销毁时的操作
## changePassword
修改密码时的操作,这里有一个`$password`参数,新密码会从这个参数传递进来,所以向服务器发送修改密码请求时请务必使用该参数而不是用`$this->service->password`,这样可能导致密码修改失败。无需在插件中更新`password`字段,系统会在`code=0`的前提下自动更新。
## upgradeDowngrade
升降级操作,该方法暂定,后续可能会变更
# 父类方法(需重写)
## 配置的规则
凡是config方法,都需要遵循以下规则:
1. 返回值的形式为二维数组,形式为:
```
return [
'package' => ['type' => 'text', 'label' => '包名'],
];
```
其中,package为字段名,type为表单类型(支持Laravel-admin的所有表单类型),label为标签,除此之外的所有配置,都跟Laravel的链式调用一致,例如
```
$form->number('stock','库存')->min(0)->required();
```
换成二维数组就是
```
return [
'stock' => ['type' => 'number', 'label' => '库存', 'min'=>0, 'required'=>true],
];
```
目前尚未支持链式调用的第二个参数,未来视情况可能还会更换为其他形式(例如传入$form让插件自己去写$form->xxx)
## userLogin
用户区登录表单,一般设置一个按钮即可,用户名、密码等信息系统已经帮你显示出来了,不需要再显示一遍。返回HTML文本即可。
## adminLogin
管理区登录表单,跟`userLogin`功能相近,但是是在后台的服务器管理列表显示的,用于管理员快捷登录面板后台。返回HTML文本即可。
## otherConfig
`其他`选项夹下的设置
## productConfig
产品配置,会在产品管理中选择服务器插件后显示
## userConfig
用户前端设置
## upgradeDowngradeConfig
升降级产品设置
## userUpgradeDowngradeConfig
升降级前端设置
## domainConfig
域名设置
## defaultPort
默认端口,返回端口数字即可。会在未设置服务器端口时使用该端口设置。
## serviceInfo
服务信息(显示在服务详情中)
## serviceConfig
后端服务设置项,仅限编辑服务时使用,会从数据库自动填充extra数据
不允许使用的键名:请看[一些操作需要遵守的规则](#一些操作需要遵守的规则)
# 其他方法
还有一些方法不需要重写,但是仍然值得介绍一下:
## getHost、getPort
这两个是保护方法,只能类内(包括子类)访问,用于获取最终的host和port,就不需要自己判断怎么获取了。**开发时非常实用的方法,需要特别注意。**
## init
这个方法用于传入产品、服务、服务器模型,即初始化成员变量。一般而言不要动。
## info
Plugin接口要求实现的方法,这里直接读取成员变量。一般而言不要动。
## hook
Plugin接口要求实现的方法,可以按自己的需求来配置,默认为空。
## command
执行命令插件,预置了create、suspend、unsuspend、terminate、change_password命令,对应前五个抽象方法的执行。但是通过command方法执行,会在执行成功时自动更新对应的status,修改密码成功也会自动更新密码(这就是为什么changePassword方法不需要在插件中修改服务密码,因为已经帮你设计好了)。如果不属于这5个命令,那么将会调用对应命令名称的插件公有方法,不存在则返回 `['code' => -1, 'msg' => 'Method does not Exist']`,无法调用(例如保护和私有方法)则返回 `['code' => -2, 'msg' => 'Method is not callable']`,执行成功则返回方法的返回值。这里建议也跟操作的返回规范一致,否则判断成功的时候可能会有问题。
