Webman插件必须声明"type": "composer-plugin",依赖"composer-plugin-api": "^2.0",且extra.class指向实现PluginInterface的可自动加载主类;否则无法被识别激活,config/plugin目录也不会自动生成。

Webman 本身不依赖 Composer 插件运行,但如果你要为 Webman 生态开发可复用、可自动集成的扩展(比如加密组件、钉钉通知、协程驱动适配器),就必须走标准 Composer 插件路径——否则无法在 composer require 后自动注入配置、注册中间件或启动进程。
Composer 插件必须声明 type: "composer-plugin"
这是最常被跳过的硬性门槛。Webman 插件如果只是普通包(type: "library"),哪怕写了 config/plugin/xxx 目录,也不会被 Webman 自动加载;而 Composer 插件若没声明类型,根本不会被 Composer 实例识别和激活。
-
composer.json中必须包含"type": "composer-plugin" - 必须依赖
"composer-plugin-api": "^2.0"(不是composer/composer,后者是开发时可选) -
extra.class要指向实现PluginInterface的主类,且该类必须可自动加载(PSR-4) - 不要在插件里写
require vendor/autoload.php—— Composer 已托管自动加载
插件激活后需监听 post-package-install 或 post-autoload-dump
Webman 的插件机制靠的是目录约定(config/plugin/xxx),但这个目录不会凭空出现。Composer 插件得自己在安装后把模板配置复制过去,否则 Webman 启动时读不到任何配置。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 推荐监听
post-package-install:只在当前插件被安装时触发,精准可控 - 避免用
post-install-cmd:它在每次composer install都执行,容易重复拷贝或覆盖用户已改的配置 - 拷贝操作要用
IOInterface输出提示,并检查目标路径是否存在,防止静默失败 - 示例逻辑:
$io->write("Copying config/plugin/tinywan/encryption...");→Filesystem::copyDirectory(...)
Webman 插件不能只靠 Composer 插件机制完成全部集成
Composer 插件能做的事有限:复制文件、输出提示、修改 autoload、注册自定义 installer。但它无法直接注册 Webman 的中间件、路由或进程——这些必须由 Webman 在运行时主动加载,而加载依据就是 config/plugin/xxx 下的 middleware.php、process.php 等文件。
- 你的 Composer 插件必须确保生成的
config/plugin/xxx/middleware.php返回一个数组,格式与 Webman 原生一致 - 中间件类名必须可被自动加载(比如放在
src/Middleware/EncryptMiddleware.php,且 PSR-4 映射正确) - 若插件含命令行功能(如
php webman tinywan:encrypt-test),需额外配合webman/console,并手动在bootstrap.php中注册命令类 - 别试图在
activate()里调用Route::get()—— 此时 Webman 的 Router 尚未初始化,会报Class 'support\Route' not found
真正麻烦的不是写插件,而是让插件“既能在首次安装时正确落地配置,又能在后续更新时不破坏用户已定制的内容”。拷贝前判断文件是否已被修改、提供 --force 覆盖开关、把用户可配置项抽到 config/plugin/xxx/app.php 并用 config('plugin.tinywan.encryption.app.key') 读取——这些细节比钩子函数本身更决定插件能否被长期维护。

















