mirror of
https://github.com/zhamao-robot/zhamao-framework.git
synced 2026-03-19 05:34:53 +08:00
82 lines
28 KiB
HTML
82 lines
28 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en-US">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
|
||
<title>插件开发 | 炸毛框架 v3</title>
|
||
<meta name="description" content="">
|
||
<meta name="generator" content="VuePress 1.9.10">
|
||
<link rel="icon" href="/logo_trans.png">
|
||
<script>
|
||
var _hmt = _hmt || [];
|
||
(function () {
|
||
var hm = document.createElement("script");
|
||
hm.src = "https://hm.baidu.com/hm.js?f0f276cefa10aa31a20ae3815a50b795";
|
||
var s = document.getElementsByTagName("script")[0];
|
||
s.parentNode.insertBefore(hm, s);
|
||
})();
|
||
</script>
|
||
<meta name="description" content="一个高性能聊天机器人 + Web 框架">
|
||
<link rel="preload" href="/assets/css/0.styles.de075592.css" as="style"><link rel="preload" href="/assets/js/app.cf958133.js" as="script"><link rel="preload" href="/assets/js/2.4c04991c.js" as="script"><link rel="preload" href="/assets/js/1.d8755a39.js" as="script"><link rel="preload" href="/assets/js/57.2166b068.js" as="script"><link rel="preload" href="/assets/js/18.26c46c49.js" as="script"><link rel="prefetch" href="/assets/js/10.960912c3.js"><link rel="prefetch" href="/assets/js/11.cd171694.js"><link rel="prefetch" href="/assets/js/12.ff9ca1d1.js"><link rel="prefetch" href="/assets/js/13.a56deac8.js"><link rel="prefetch" href="/assets/js/14.b222a011.js"><link rel="prefetch" href="/assets/js/15.31489867.js"><link rel="prefetch" href="/assets/js/16.e921dbc4.js"><link rel="prefetch" href="/assets/js/17.58f730d3.js"><link rel="prefetch" href="/assets/js/19.ee0bfd3b.js"><link rel="prefetch" href="/assets/js/20.bb3578b8.js"><link rel="prefetch" href="/assets/js/21.e66f7fe5.js"><link rel="prefetch" href="/assets/js/22.cba8ca48.js"><link rel="prefetch" href="/assets/js/23.cb49f41c.js"><link rel="prefetch" href="/assets/js/24.d95b175a.js"><link rel="prefetch" href="/assets/js/25.b0d69869.js"><link rel="prefetch" href="/assets/js/26.8e7089c0.js"><link rel="prefetch" href="/assets/js/27.333a53a1.js"><link rel="prefetch" href="/assets/js/28.df4b871c.js"><link rel="prefetch" href="/assets/js/29.5427ad45.js"><link rel="prefetch" href="/assets/js/3.07fc018e.js"><link rel="prefetch" href="/assets/js/30.7cb7445a.js"><link rel="prefetch" href="/assets/js/31.5c4bb546.js"><link rel="prefetch" href="/assets/js/32.7fc05474.js"><link rel="prefetch" href="/assets/js/33.9684a4f8.js"><link rel="prefetch" href="/assets/js/34.83e32a28.js"><link rel="prefetch" href="/assets/js/35.95d03df6.js"><link rel="prefetch" href="/assets/js/36.80aace42.js"><link rel="prefetch" href="/assets/js/37.1eaed2ee.js"><link rel="prefetch" href="/assets/js/38.75fa7a1c.js"><link rel="prefetch" href="/assets/js/39.117f5802.js"><link rel="prefetch" href="/assets/js/4.6623271b.js"><link rel="prefetch" href="/assets/js/40.57eba153.js"><link rel="prefetch" href="/assets/js/41.89c4a7c8.js"><link rel="prefetch" href="/assets/js/42.d8f92f99.js"><link rel="prefetch" href="/assets/js/43.5ee83631.js"><link rel="prefetch" href="/assets/js/44.c09b5b0c.js"><link rel="prefetch" href="/assets/js/45.bd850606.js"><link rel="prefetch" href="/assets/js/46.732b1cef.js"><link rel="prefetch" href="/assets/js/47.2a872d0d.js"><link rel="prefetch" href="/assets/js/48.959e18f4.js"><link rel="prefetch" href="/assets/js/49.a9bb32f7.js"><link rel="prefetch" href="/assets/js/5.073233e8.js"><link rel="prefetch" href="/assets/js/50.ca90a854.js"><link rel="prefetch" href="/assets/js/51.79142530.js"><link rel="prefetch" href="/assets/js/52.fe63ad16.js"><link rel="prefetch" href="/assets/js/53.ed84845a.js"><link rel="prefetch" href="/assets/js/54.3ab7e492.js"><link rel="prefetch" href="/assets/js/55.9028e407.js"><link rel="prefetch" href="/assets/js/56.8173f798.js"><link rel="prefetch" href="/assets/js/58.7c52b6bf.js"><link rel="prefetch" href="/assets/js/59.e9965a7b.js"><link rel="prefetch" href="/assets/js/60.f277436c.js"><link rel="prefetch" href="/assets/js/61.3712f8fe.js"><link rel="prefetch" href="/assets/js/8.899a0731.js"><link rel="prefetch" href="/assets/js/9.e2e8da12.js"><link rel="prefetch" href="/assets/js/vendors~docsearch.303532f0.js">
|
||
<link rel="stylesheet" href="/assets/css/0.styles.de075592.css">
|
||
</head>
|
||
<body>
|
||
<div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="ant-row"><div class="nav-button"><i aria-label="icon: bars" class="anticon anticon-bars"><svg viewBox="0 0 1024 1024" focusable="false" data-icon="bars" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M912 192H328c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h584c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 284H328c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h584c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 284H328c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h584c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM104 228a56 56 0 1 0 112 0 56 56 0 1 0-112 0zm0 284a56 56 0 1 0 112 0 56 56 0 1 0-112 0zm0 284a56 56 0 1 0 112 0 56 56 0 1 0-112 0z"></path></svg></i> <span></span></div> <div class="ant-col ant-col-xs-24 ant-col-sm-24 ant-col-md-6 ant-col-lg-6 ant-col-xl-5 ant-col-xxl-4"><a href="/" class="router-link-active home-link"><img src="/logo_trans.png" alt="炸毛框架 v3" class="logo"> <span class="site-name">炸毛框架 v3</span></a> <div class="search-box mobile-search"><input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div></div> <div class="nav-space-between ant-col ant-col-xs-0 ant-col-sm-0 ant-col-md-18 ant-col-lg-18 ant-col-xl-19 ant-col-xxl-20"><div class="search-box"><input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div> <nav class="nav-links can-hide"><ul role="menu" id="nav" class="ant-menu ant-menu-horizontal ant-menu-root ant-menu-light"><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display:none;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li><li role="menuitem" class="ant-menu-item"><a href="/guide/">
|
||
指南
|
||
</a></li><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display:none;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li><li role="menuitem" class="ant-menu-item"><a href="/event/">
|
||
事件
|
||
</a></li><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display:none;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li><li role="menuitem" class="ant-menu-item"><a href="/components/bot/bot-context.html">
|
||
组件
|
||
</a></li><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display:none;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li><li role="menuitem" class="ant-menu-item"><a href="/plugins/management.html">
|
||
插件
|
||
</a></li><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display:none;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li><li role="menuitem" class="ant-menu-item"><a href="/advanced/">
|
||
进阶
|
||
</a></li><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display:none;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li><li role="menuitem" class="ant-menu-item"><a href="/update/v3.html">
|
||
更新日志
|
||
</a></li><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display:none;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li><li role="menuitem" class="ant-menu-item"><a href="/doxy/" target="_blank">
|
||
API 文档
|
||
<i aria-label="icon: link" class="anticon anticon-link"><svg viewBox="64 64 896 896" focusable="false" data-icon="link" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M574 665.4a8.03 8.03 0 0 0-11.3 0L446.5 781.6c-53.8 53.8-144.6 59.5-204 0-59.5-59.5-53.8-150.2 0-204l116.2-116.2c3.1-3.1 3.1-8.2 0-11.3l-39.8-39.8a8.03 8.03 0 0 0-11.3 0L191.4 526.5c-84.6 84.6-84.6 221.5 0 306s221.5 84.6 306 0l116.2-116.2c3.1-3.1 3.1-8.2 0-11.3L574 665.4zm258.6-474c-84.6-84.6-221.5-84.6-306 0L410.3 307.6a8.03 8.03 0 0 0 0 11.3l39.7 39.7c3.1 3.1 8.2 3.1 11.3 0l116.2-116.2c53.8-53.8 144.6-59.5 204 0 59.5 59.5 53.8 150.2 0 204L665.3 562.6a8.03 8.03 0 0 0 0 11.3l39.8 39.8c3.1 3.1 8.2 3.1 11.3 0l116.2-116.2c84.5-84.6 84.5-221.5 0-306.1zM610.1 372.3a8.03 8.03 0 0 0-11.3 0L372.3 598.7a8.03 8.03 0 0 0 0 11.3l39.6 39.6c3.1 3.1 8.2 3.1 11.3 0l226.4-226.4c3.1-3.1 3.1-8.2 0-11.3l-39.5-39.6z"></path></svg></i></a></li><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display:none;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li><li role="menuitem" class="ant-menu-item"><a href="https://docs-v2.zhamao.xin/" target="_blank">
|
||
炸毛框架 v2
|
||
<i aria-label="icon: link" class="anticon anticon-link"><svg viewBox="64 64 896 896" focusable="false" data-icon="link" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M574 665.4a8.03 8.03 0 0 0-11.3 0L446.5 781.6c-53.8 53.8-144.6 59.5-204 0-59.5-59.5-53.8-150.2 0-204l116.2-116.2c3.1-3.1 3.1-8.2 0-11.3l-39.8-39.8a8.03 8.03 0 0 0-11.3 0L191.4 526.5c-84.6 84.6-84.6 221.5 0 306s221.5 84.6 306 0l116.2-116.2c3.1-3.1 3.1-8.2 0-11.3L574 665.4zm258.6-474c-84.6-84.6-221.5-84.6-306 0L410.3 307.6a8.03 8.03 0 0 0 0 11.3l39.7 39.7c3.1 3.1 8.2 3.1 11.3 0l116.2-116.2c53.8-53.8 144.6-59.5 204 0 59.5 59.5 53.8 150.2 0 204L665.3 562.6a8.03 8.03 0 0 0 0 11.3l39.8 39.8c3.1 3.1 8.2 3.1 11.3 0l116.2-116.2c84.5-84.6 84.5-221.5 0-306.1zM610.1 372.3a8.03 8.03 0 0 0-11.3 0L372.3 598.7a8.03 8.03 0 0 0 0 11.3l39.6 39.6c3.1 3.1 8.2 3.1 11.3 0l226.4-226.4c3.1-3.1 3.1-8.2 0-11.3l-39.5-39.6z"></path></svg></i></a></li><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="visibility:hidden;position:absolute;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li></ul> <ul class="extra-group"><li><a href="https://github.com/zhamao-robot/zhamao-framework" target="_blank" rel="noopener noreferrer" class="repo-link"><i aria-label="icon: github" class="anticon anticon-github"><svg viewBox="64 64 896 896" focusable="false" data-icon="github" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M511.6 76.3C264.3 76.2 64 276.4 64 523.5 64 718.9 189.3 885 363.8 946c23.5 5.9 19.9-10.8 19.9-22.2v-77.5c-135.7 15.9-141.2-73.9-150.3-88.9C215 726 171.5 718 184.5 703c30.9-15.9 62.4 4 98.9 57.9 26.4 39.1 77.9 32.5 104 26 5.7-23.5 17.9-44.5 34.7-60.8-140.6-25.2-199.2-111-199.2-213 0-49.5 16.3-95 48.3-131.7-20.4-60.5 1.9-112.3 4.9-120 58.1-5.2 118.5 41.6 123.2 45.3 33-8.9 70.7-13.6 112.9-13.6 42.4 0 80.2 4.9 113.5 13.9 11.3-8.6 67.3-48.8 121.3-43.9 2.9 7.7 24.7 58.3 5.5 118 32.4 36.8 48.9 82.7 48.9 132.3 0 102.2-59 188.1-200 212.9a127.5 127.5 0 0 1 38.1 91v112.5c.8 9 0 17.9 15 17.9 177.1-59.7 304.6-227 304.6-424.1 0-247.2-200.4-447.3-447.5-447.3z"></path></svg></i></a></li> <!----></ul></nav></div></div> <!----></header> <aside class="sidebar"><!----> <ul class="sidebar-links"><li><section class="sidebar-group depth-0"><p class="sidebar-heading open"><span>插件系统</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/plugins/management.html" title="插件管理" class="sidebar-link">插件管理</a></li><li><a href="/plugins/develop.html" aria-current="page" title="插件开发" class="active sidebar-link">插件开发</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/plugins/develop.html#创建插件" title="创建插件" class="sidebar-link">创建插件</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/plugins/develop.html#单文件模式" title="单文件模式" class="sidebar-link">单文件模式</a></li><li class="sidebar-sub-header"><a href="/plugins/develop.html#多文件模式" title="多文件模式" class="sidebar-link">多文件模式</a></li><li class="sidebar-sub-header"><a href="/plugins/develop.html#混合模式" title="混合模式" class="sidebar-link">混合模式</a></li></ul></li><li class="sidebar-sub-header"><a href="/plugins/develop.html#编写插件-wip" title="编写插件(WIP)" class="sidebar-link">编写插件(WIP)</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/plugins/develop.html#机器人命令问答" title="机器人命令问答" class="sidebar-link">机器人命令问答</a></li></ul></li><li class="sidebar-sub-header"><a href="/plugins/develop.html#插件打包" title="插件打包" class="sidebar-link">插件打包</a></li><li class="sidebar-sub-header"><a href="/plugins/develop.html#插件发布" title="插件发布" class="sidebar-link">插件发布</a></li></ul></li><li><a href="/plugins/market.html" title="插件市场" class="sidebar-link">插件市场</a></li></ul></section></li></ul> </aside> <main class="page has-page-anchor"> <div class="theme-antdocs-content content__default"><h1 id="插件开发"><a href="#插件开发" class="header-anchor">#</a> 插件开发</h1> <p>在框架环境准备就绪后,可以使用框架提供的命令、工具集进行插件的开发。</p> <p>如果你还没有阅读 <a href="/guide/get-started.html">快速上手-聊天机器人</a> 章节的内容,请先阅读。</p> <h2 id="创建插件"><a href="#创建插件" class="header-anchor">#</a> 创建插件</h2> <p>框架默认支持两种形式的插件,一种是 <code>file</code> 单文件模式,另一种是 <code>psr4</code> 多文件模式。一般情况下,写一个较为简单的功能插件,推荐使用单文件模式,便于管理。
|
||
编写功能较多、需要分多个文件写逻辑的插件,推荐使用 <code>psr4</code> 多文件模式。</p> <p>框架的插件命名方式基于 Composer,Composer 要求组件、插件的名称要有开发者名称和项目名称两部分组成。
|
||
例如,我的开发者代号仓库是 <code>jackson</code>,插件名称是 <code>group-manager</code>,最终你的插件名称就是 <code>jackson/group-manager</code>。</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code><span class="token comment"># 使用终端问答向导创建插件,可根据终端的提示选择你要创建插件的名称、类型和命名空间等内容。</span>
|
||
./zhamao plugin:make <span class="token parameter variable">--type</span><span class="token operator">=</span>file
|
||
<span class="token comment"># 使用 file 类型的示例骨架创建插件,插件名称为 foobar/test-plugin</span>
|
||
./zhamao plugin:make <span class="token parameter variable">--type</span><span class="token operator">=</span>file foobar/test-plugin
|
||
<span class="token comment"># 使用 psr4 类型的示例骨架创建插件,插件名称为 foobar/psr4-plugin,命名空间为 foobar</span>
|
||
./zhamao plugin:make <span class="token parameter variable">--type</span><span class="token operator">=</span>psr4 <span class="token parameter variable">--namespace</span><span class="token operator">=</span>foobar foobar/psr4-plugin
|
||
<span class="token comment"># 设置插件作者名称、描述信息</span>
|
||
./zhamao plugin:make <span class="token parameter variable">--author</span><span class="token operator">=</span>tom <span class="token parameter variable">--description</span><span class="token operator">=</span><span class="token string">"示例插件"</span>
|
||
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br></div></div><h3 id="单文件模式"><a href="#单文件模式" class="header-anchor">#</a> 单文件模式</h3> <p>单文件模式的优势在于以下几点:</p> <ul><li>代码较少的情况下,逻辑表达更清晰,可直接在单文件结构下编写机器人、HTTP 服务器的逻辑。</li> <li>可以添加额外的框架事件 <code>onPluginLoad</code>(框架在读取插件元信息后触发的事件)。</li> <li>可以添加额外的框架事件 <code>onPack</code>(插件在被打包时执行的回调函数)。</li></ul> <p>单文件模式下的插件目录结构如下图所示:</p> <div class="language-text line-numbers-mode"><pre class="language-text"><code>plugins/
|
||
└── test-app/
|
||
├── main.php # 你的插件源代码文件
|
||
└── composer.json # 插件元信息(如名称、版本等)
|
||
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br></div></div><p>使用 file 模式创建的插件会在 <code>./plugins/</code> 目录下新建一个文件夹,文件夹名称一般为插件名称 <code>xxx/yyy</code> 的 <code>yyy</code>。如果遇到重名文件夹时,框架会提示重名。</p> <p>当然,单文件模式也有劣势:</p> <ul><li>插件依赖了其他外部 Composer 组件时,依赖管理不方便。</li> <li>插件逻辑较为复杂时,写到一个文件内会导致代码过长,不利于维护。</li> <li>一些注解的绑定、中间件,均无法在单文件模式中使用。</li></ul> <h3 id="多文件模式"><a href="#多文件模式" class="header-anchor">#</a> 多文件模式</h3> <p>多文件模式适用于几乎任何情况,有以下优势:</p> <ul><li>逻辑复杂时,使用 Class 类名和注解绑定的形式,有助于编写大型项目。</li> <li>逻辑简单但功能点繁多时,可以使用类成员的多个绑定注解的方法区分功能逻辑,避免单文件的混乱。</li> <li>可以使用注解的全部特性,例如中间件绑定、依赖注入等。</li></ul> <p>多文件模式下的插件目录结构如下图所示:</p> <div class="language-text line-numbers-mode"><pre class="language-text"><code>plugins/
|
||
└── psr4-plugin/
|
||
├── composer.json # 插件元信息(如名称、版本等)
|
||
├── vendor/ # Composer 生成的插件依赖库目录和自动加载文件等
|
||
└── src/ # 你的插件源代码文件目录,符合 PSR-4 格式的
|
||
├── Psr4Plugin.php # 使用创建插件命令生成的初始插件逻辑
|
||
└── ... # 如果你的插件想要分成多个 PHP 文件,那么这里可以有多个
|
||
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br></div></div><h3 id="混合模式"><a href="#混合模式" class="header-anchor">#</a> 混合模式</h3> <p>混合模式为单文件模式和多文件模式的结合,框架不提供创建混合模式插件脚手架的命令,但你可以自行混合。</p> <p>混合模式其实就是多文件模式,只不过同时也可以引入一个单文件插件,弥补多文件模式没办法绑定 <code>onPack</code> 和 <code>onPluginLoad</code> 事件的问题。</p> <p>混合模式在多文件模式的基础上多了一个 <code>main.php</code> 的单文件:</p> <div class="language-text line-numbers-mode"><pre class="language-text"><code>plugins/
|
||
└── psr4-plugin/
|
||
├── composer.json # 插件元信息(如名称、版本等)
|
||
├── vendor/ # Composer 生成的插件依赖库目录和自动加载文件等
|
||
├── main.php # 插件逻辑(单文件部分)
|
||
└── src/ # 你的插件源代码文件目录(多文件部分)
|
||
├── Psr4Plugin.php # 使用创建插件命令生成的初始插件逻辑
|
||
└── ... # 如果你的插件想要分成多个 PHP 文件,那么这里可以有多个
|
||
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br></div></div><p>在通过以上三种方式创建插件后,你可以通过 IDE、记事本等形式开始编写你的插件逻辑啦!</p> <h2 id="编写插件-wip"><a href="#编写插件-wip" class="header-anchor">#</a> 编写插件(WIP)</h2> <blockquote><p>此处文档正在努力编写中!</p></blockquote> <p>插件的编写内容当然取决于异想天开的你,这里用最基本和最典型的例子来说明如何从零编写一个自己的插件。</p> <h3 id="机器人命令问答"><a href="#机器人命令问答" class="header-anchor">#</a> 机器人命令问答</h3> <p>在使用框架的上方创建插件命令创建了一个插件目录和骨架文件后,打开文件可以看到默认生成了一个 BotCommand 机器人聊天命令事件,返回的内容为一句简单的话。
|
||
你可以在创建插件后直接使用此命令,在对接机器人实现端(OneBot 12 实现)后,在与机器人对话的窗口或 App 内发送指令,即可测试机器人插件是否正常运行。</p> <p>我们这里假设通过 psr4 模式创建了插件 <code>foobar/demo2</code>,初始化时预置的机器人聊天命令代码可能是下面这样:</p> <div class="language-php line-numbers-mode"><pre class="language-php"><code><span class="token attribute"><span class="token delimiter punctuation">#[</span><span class="token attribute-content"><span class="token attribute-class-name class-name">BotCommand</span><span class="token punctuation">(</span><span class="token attribute-class-name class-name">match</span><span class="token punctuation">:</span> <span class="token string single-quoted-string">'测试demo2'</span><span class="token punctuation">)</span></span><span class="token delimiter punctuation">]</span></span>
|
||
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">firstBotCommand</span><span class="token punctuation">(</span><span class="token class-name type-declaration">BotContext</span> <span class="token variable">$ctx</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword return-type">void</span>
|
||
<span class="token punctuation">{</span>
|
||
<span class="token variable">$ctx</span><span class="token operator">-></span><span class="token function">reply</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'这是foobar/demo2插件的第一个命令!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
|
||
<span class="token punctuation">}</span>
|
||
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br></div></div><div class="doc-chat-container" data-v-76085dc2><div class="doc-chat-content" data-v-76085dc2><div type="0" content="测试demo2" data-v-76085dc2><div class="doc-chat-row" data-v-76085dc2><div class="doc-chat-box" data-v-76085dc2>测试demo2</div> <img src="https://zhamao.xin/images/customer_avatar.png" alt class="doc-chat-avatar" data-v-76085dc2></div></div><div type="1" content="这是foobar/demo2插件的第一个命令!" data-v-76085dc2><div class="doc-chat-row doc-chat-row-robot" data-v-76085dc2><img src="https://docs-v1.zhamao.xin/logo.png" alt class="doc-chat-avatar" data-v-76085dc2> <div class="doc-chat-box doc-chat-box-robot" data-v-76085dc2><span data-v-76085dc2>这是foobar/demo2插件的第一个命令!<br data-v-76085dc2></span></div></div></div></div></div> <p>在编写插件逻辑时,你可以自由使用框架内的各个组件和注解,这里不再过多描述。</p> <h2 id="插件打包"><a href="#插件打包" class="header-anchor">#</a> 插件打包</h2> <p>在写了在写了。</p> <h2 id="插件发布"><a href="#插件发布" class="header-anchor">#</a> 插件发布</h2> <p>在写了!</p></div> <footer class="page-edit"><div class="edit-link"><a href="https://github.com/zhamao-robot/zhamao-framework/edit/main/docs/plugins/develop.md" target="_blank" rel="noopener noreferrer">Edit this page</a> <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></div> <!----></footer> <div class="page-nav"><p class="inner"><span class="prev"><a href="/plugins/management.html" class="prev"><i aria-label="icon: left" class="anticon anticon-left"><svg viewBox="64 64 896 896" focusable="false" data-icon="left" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M724 218.3V141c0-6.7-7.7-10.4-12.9-6.3L260.3 486.8a31.86 31.86 0 0 0 0 50.3l450.8 352.1c5.3 4.1 12.9.4 12.9-6.3v-77.3c0-4.9-2.3-9.6-6.1-12.6l-360-281 360-281.1c3.8-3 6.1-7.7 6.1-12.6z"></path></svg></i>
|
||
插件管理
|
||
</a></span> <span class="next"><a href="/plugins/market.html">
|
||
插件市场
|
||
<i aria-label="icon: right" class="anticon anticon-right"><svg viewBox="64 64 896 896" focusable="false" data-icon="right" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M765.7 486.8L314.9 134.7A7.97 7.97 0 0 0 302 141v77.3c0 4.9 2.3 9.6 6.1 12.6l360 281.1-360 281.1c-3.9 3-6.1 7.7-6.1 12.6V883c0 6.7 7.7 10.4 12.9 6.3l450.8-352.1a31.96 31.96 0 0 0 0-50.4z"></path></svg></i></a></span></p></div> <div class="page-anchor"><div class="ant-space ant-space-vertical" style="width:100%;"><div class="ant-space-item"><div class="page-anchor-offset"><div><div class="ant-anchor-wrapper" style="max-height:100vh;"><div class="ant-anchor"><div class="ant-anchor-ink"><span class="ant-anchor-ink-ball"></span></div><div class="ant-anchor-link"><a href="#创建插件" title="创建插件" class="ant-anchor-link-title">创建插件</a><div class="ant-anchor-link"><a href="#单文件模式" title="单文件模式" class="ant-anchor-link-title">单文件模式</a></div><div class="ant-anchor-link"><a href="#多文件模式" title="多文件模式" class="ant-anchor-link-title">多文件模式</a></div><div class="ant-anchor-link"><a href="#混合模式" title="混合模式" class="ant-anchor-link-title">混合模式</a></div></div><div class="ant-anchor-link"><a href="#编写插件-wip" title="编写插件(WIP)" class="ant-anchor-link-title">编写插件(WIP)</a><div class="ant-anchor-link"><a href="#机器人命令问答" title="机器人命令问答" class="ant-anchor-link-title">机器人命令问答</a></div></div><div class="ant-anchor-link"><a href="#插件打包" title="插件打包" class="ant-anchor-link-title">插件打包</a></div><div class="ant-anchor-link"><a href="#插件发布" title="插件发布" class="ant-anchor-link-title">插件发布</a></div></div></div></div></div></div></div></div> </main> <!----></div><div class="global-ui"></div></div>
|
||
<script src="/assets/js/app.cf958133.js" defer></script><script src="/assets/js/2.4c04991c.js" defer></script><script src="/assets/js/1.d8755a39.js" defer></script><script src="/assets/js/57.2166b068.js" defer></script><script src="/assets/js/18.26c46c49.js" defer></script>
|
||
</body>
|
||
</html> |