AI写作智能体 自主规划任务,支持联网查询和网页读取,多模态高效创作各类分析报告、商业计划、营销方案、教学内容等。 广告
**注意:服务器插件的本质是一个插件,因此可以被调用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']`,执行成功则返回方法的返回值。这里建议也跟操作的返回规范一致,否则判断成功的时候可能会有问题。