zhamao-framework/plugins/develop.html
2024-09-19 08:29:13 +00:00

82 lines
28 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!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>框架的插件命名方式基于 ComposerComposer 要求组件、插件的名称要有开发者名称和项目名称两部分组成。
例如,我的开发者代号仓库是 <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">&quot;示例插件&quot;</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">-&gt;</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>