Skip to content

插件系统概述

MineShop 采用 Hyperf 的 ConfigProvider 机制实现插件系统,支持热插拔、配置合并、自动注册等特性。

🎯 插件架构

plugins/
├── export-center/           # 导出中心插件
│   ├── src/
│   │   ├── ConfigProvider.php    # 插件配置提供者
│   │   ├── Controller/           # 控制器
│   │   ├── Service/              # 服务层
│   │   ├── Process/              # 进程
│   │   └── Writer/               # 导出写入器
│   ├── web/                      # 前端资源
│   └── composer.json
├── wechat/                  # 微信插件
└── ...

✨ 核心特性

1. ConfigProvider 机制

每个插件通过 ConfigProvider 类声明配置:

php
// plugins/export-center/src/ConfigProvider.php
class ConfigProvider
{
    public function __invoke()
    {
        return [
            // 注解扫描路径
            'annotations' => [
                'scan' => [
                    'paths' => [__DIR__],
                ],
            ],
            // 异步队列配置(自动合并)
            'async_queue' => [
                'export' => [
                    'driver' => RedisDriver::class,
                    'channel' => '{export-queue}',
                    'handle_timeout' => 600,
                    'processes' => 1,
                    'concurrent' => ['limit' => 5],
                ],
            ],
            // 自定义进程
            'processes' => [
                ExportConsumerProcess::class,
            ],
        ];
    }
}

2. 配置自动合并

插件配置会自动与主应用配置合并,无需手动修改 config/autoload/*.php

php
// 主应用 async_queue.php
return [
    'default' => [...],
];

// 插件 ConfigProvider 中的 async_queue
'async_queue' => [
    'export' => [...],
]

// 最终合并结果
[
    'default' => [...],
    'export' => [...],  // 自动合并
]

3. 前端资源集成

插件可包含前端资源,通过 web/index.ts 导出:

typescript
// plugins/export-center/web/index.ts
export default {
  name: 'export-center',
  routes: [...],
  menus: [...],
}

📦 已有插件

插件说明文档
export-center通用导出中心查看
wechat微信集成查看

🔧 插件开发

目录结构

my-plugin/
├── src/
│   ├── ConfigProvider.php    # 必需:配置提供者
│   ├── Controller/           # 可选:控制器
│   ├── Service/              # 可选:服务
│   └── ...
├── web/                      # 可选:前端资源
├── composer.json             # 必需:包定义
└── README.md                 # 推荐:说明文档

composer.json 示例

json
{
    "name": "mineshop/my-plugin",
    "type": "library",
    "autoload": {
        "psr-4": {
            "Plugin\\MyPlugin\\": "src/"
        }
    },
    "extra": {
        "hyperf": {
            "config": "Plugin\\MyPlugin\\ConfigProvider"
        }
    }
}

⚠️ 注意事项

  1. 命名空间: 插件使用 Plugin\{PluginName} 命名空间
  2. 配置冲突: 避免与主应用配置键名冲突
  3. 依赖管理: 在 composer.json 中声明依赖
  4. 版本兼容: 注意与主应用版本兼容性

📚 相关文档

基于 Apache-2.0 许可发布 | 感谢 MineAdmin 提供的优秀基础框架