插件开发 6
更新于 2026-10-13
插件开发 · 目录结构
插件(源码 / 扩展)放在项目根目录的 addons/ 下,每个插件一个文件夹。
一、目录规范
addons/
└── myplugin/
├── info.ini 插件清单(必需)
├── config.php 插件配置字段定义
├── Myplugin.php 插件入口类(必需,类名 = 目录名首字母大写)
├── install/
│ ├── install.sql 安装时执行(可选)
│ ├── uninstall.sql 卸载时执行(可选)
│ └── app/ 随插件分发的前台/后台代码(安装时复制)
├── admin/ 后台控制器与视图
│ ├── controller/
│ └── view/
├── controller/ 前台控制器(可选)
├── view/ 前台视图(可选)
├── static/ 静态资源(安装时复制到 public/addons/myplugin/)
└── README.md
二、info.ini
name = myplugin
title = 我的插件
intro = 一句话介绍这个插件能做什么
author = 你的名字
version = 1.0.0
require = 1.0.0
| 键 | 说明 |
|---|---|
name | 插件标识,必须与目录名一致 |
title | 中文名称,显示在后台列表 |
intro | 简介 |
author | 作者 |
version | 版本号,用于升级比较 |
require | 要求的最低 CMS 版本 |
三、入口类
<?php
namespace addons\myplugin;
use think\Addons;
class Myplugin extends Addons
{
/** 插件安装 */
public function install()
{
return true;
}
/** 插件卸载 */
public function uninstall()
{
return true;
}
/** 注册后台菜单与权限节点 */
public function menu()
{
return [
[
'name' => '我的插件',
'icon' => 'fa-solid fa-plug',
'url' => 'myplugin/index/index',
'child' => [
['name' => '设置', 'url' => 'myplugin/index/config'],
],
],
];
}
}
四、config.php
<?php
return [
[
'name' => 'api_key',
'title' => '接口密钥',
'type' => 'text',
'value' => '',
'tip' => '在服务商后台获取',
'rule' => 'require',
],
[
'name' => 'switch_on',
'title' => '启用功能',
'type' => 'switch',
'value' => '1',
],
];
后台会自动渲染成设置表单,值存入 ws_addon_config。
读取配置:
use think\facade\Config;
$key = Config::get('addons.myplugin.api_key');
五、安装机制
安装插件时程序会:
- 校验
info.ini与入口类是否存在
- 执行
install/install.sql(如有)
- 把
install/app/下的内容复制到应用目录(用于需要注册独立控制器的插件)
- 把
static/复制到public/addons/<name>/
- 注册菜单与权限节点
- 写入
ws_addon记录并标记为已安装
卸载时反向执行:执行 uninstall.sql、移除菜单与权限节点、删除 public/addons/<name>/,但保留用户数据(除非插件显式声明删除)。
六、打包与发布
cd addons/myplugin
zip -r ../myplugin-1.0.0.zip . -x "*.git*" "*.DS_Store"
要点:
- zip 产物必须放在插件目录外面,否则会把自己再打进去
- 不要包含
pycache、.git、编辑器临时文件
- 上传到官网「开发者中心 → 发布应用」,分类选「功能扩展 / 编辑器 / 支付网关 …」
- 上传前建议先过一遍 安装包规范与打包 的自检清单,
打包与发布全流程见 开发者中心与上架流程