当然可能因为github无法访问,导致源码只能靠bbs1org维护,所以任何重构建议都会显得不现实,因为总会破坏现有的稳定性。
我就尽可能提一些从易到难的重构建议吧:
第一种:在现有基础上继续增加更多钩子,或者让一些硬编码的地方都能让管理员后台调整
第二种:增设内核类插件规范,一些偏底层功能的插件应该能够被调用或者也有被钩子修改的定义,然后普通插件上传应该改成不局限仅php文件
第三种:把你能看到的任何有实体化的元素全部增加抽象化
第四种:内核和能看到的元素彻底分开,内核功能全部抽象化,内核不需要知道你的实体界面长什么样,只定义有什么元素,然后怎么交互
我是倾向更灵活的理念,觉得一些参数定死太定制化了
给我感觉就是在现有的基础上改改改,在创作过程中都要考虑论坛现在长什么样,非常限制想象力
内核方面单独全部抽象,好比一个文件管理,这是基础功能,你之前提到过“默认存储是廉价的。附件存储在本地的”,其实这不算不完善这个基础插件的理由,想想其他插件直接用文件管理的钩子,就不用额外扫描类操作了因为想了很久感觉越来越分不清了,就如下问了ai

我看了你上传的 bbs1org v9.1 源码。你的直觉其实是对的,而且从源码现状来看,你提的建议并不是“凭空要求重构”:这个项目已经明显在往 Hook 化、插件化方向走,只是目前还是“在一个高度实体化的单体核心上不断打补丁式扩展 Hook”。
所以你真正想表达的其实不是“多加几个 Hook”,而是:
不要让 Hook 只是给现有页面增加扩展点,而应该逐步把核心本身变成“能力提供者”,让页面、存储、附件、搜索等具体实现都成为可替换的消费者/实现者。
这和普通的“插件系统”是两个层次。
一、先说结论:你的四级路线是成立的
我会把你的想法重新整理成这样:
| 层级 | 你原来的说法 | 我的评价 |
| -- | -------------------- | ---------------------- |
| 1 | 增加更多 Hook / 后台可配置硬编码 | 低风险,现实 |
| 2 | 内核类插件规范、基础能力也插件化 | 真正重要的转折点 |
| 3 | 有实体的东西全部抽象化 | 架构方向正确,但需要重新定义“实体” |
| 4 | 内核与界面彻底分离,内核只定义能力与交互 | 理想终态,最有价值,但也最难 |不过我会稍微修改你第 3、4 步的措辞。
你现在说:
“把你能看到的任何有实体化的元素全部增加抽象化”
以及:
“内核功能全部抽象化,内核不需要知道你的实体界面长什么样”
思想是对的,但如果直接这样跟作者说,很容易被理解成“我要你把整个论坛推倒重写”。
实际上你真正需要的是:
把“概念/能力”和“当前实现”分离。
这句话会准确很多。
二、这个源码其实已经证明你的判断
我特别注意到一点:
这个版本已经不是完全意义上的“无 Hook 单体 PHP”。
核心里面已经存在:
hook_registry() hook() fire() plugin_load() plugin_call() plugins() plugin_route()而且现在已经有大约 70 多个 Hook/事件调用点。
例如:
user.can_speak markdown.before markdown.render avatar.url topic.before_render topic.after_render topic.before_save topic.after_save reply.before_save reply.after_save topic.can_manage user.before_save login.before_submit security.rate_allow search.condition search.rebuild content.before_delete notification.after_create user.points_changed ...这非常关键。
因为这说明作者实际上已经接受了你的第一层理念:
“核心行为应该留出扩展点。”
所以你的建议不是:
“你应该搞 Hook。”
而应该进一步指出:
你现在已经有 Hook 了,但 Hook 目前主要是附着在既有实体上的扩展机制;下一步可以考虑让这些实体本身逐渐变成可替换的抽象能力。
这会是非常不一样的建议。
三、你真正想批评的,其实是“实体驱动架构”
你说的这句话我觉得非常到位:
“在创作过程中都要考虑论坛现在长什么样,非常限制想象力。”
这实际上是在批评一种很常见的架构:
核心逻辑 ↓ 论坛主题 ↓ 论坛帖子 ↓ 论坛用户 ↓ 论坛附件 ↓ 论坛页面然后插件只能:
在这些东西旁边挂一个 Hook于是插件作者的思维会被核心的数据结构和 UI 牵着走。
比如核心认为:
“附件就是帖子下面出现的一个上传框 + 本地文件。”
那么插件只能想:
“我要怎么扩展这个附件?”
而不会自然想到:
“附件其实是一种 Blob / Asset 能力,它可以存在本地、S3、对象存储、远程 URL、WebDAV,甚至根本不需要文件系统。”
这就是你举“文件管理”的例子真正厉害的地方。
四、“文件管理”这个例子,我认为非常好
你提到:
“默认存储是廉价的。附件存储在本地的,其实这不算不完善这个基础插件的理由。”
我非常赞同。
因为:
本地文件存储本身完全可以是一个优秀的默认实现。
问题不在:
“本地存储不好。”
而在:
“核心为什么必须知道附件一定是本地文件?”
这两个问题完全不同。
理想情况下可以是:
┌─ Local Storage ├─ S3 Storage Application ─── Storage API ── WebDAV ├─ OSS └─ 自定义插件核心只知道:
store() read() delete() exists() url()甚至进一步:
asset.create() asset.read() asset.delete() asset.url()那么论坛的“附件”只是这个基础能力的一种消费者。
这时候其他插件就可以直接使用:
文件管理能力 ↑ ├── 论坛附件 ├── 用户头像 ├── 图片插件 ├── 图床插件 ├── 编辑器 ├── 导入工具 └── 备份插件这比:
附件插件 图片插件 头像插件 备份插件 各自扫描 app/upload/强得多。
五、这就是你所谓的“全 Hook”最容易说不清楚的地方
我觉得你其实不应该把它叫“全 Hook 方案”。
因为“全 Hook”很容易让传统 PHP 开发者产生一种恐惧:
“是不是以后
echo都要 Hook?”“是不是一个 if 都要 Hook?”
“是不是所有函数都变成事件?”
那确实会变成灾难。
你真正描述的应该叫:
能力抽象 + Hook/Event + 可替换实现
或者更简洁:
核心能力解耦
它不是:
Everything = Hook而是:
核心定义能力 ↓ 抽象接口 / 能力契约 ↓ 默认实现 ↓ Hook / Event 扩展 ↓ 插件可以替换、增强或者监听这是完全不同的架构。
六、传统方案和你想的方案,核心差异在哪里?
可以用一个非常简单的例子解释。
传统方案
假设论坛上传附件。
核心直接做:
POST ↓ 验证 ↓ move_uploaded_file() ↓ app/upload/xxx.jpg ↓ 数据库记录 ↓ HTML <a href="...">插件可以:
attachment.uploader attachment.after_upload attachment.render所以插件只能:
围绕“本地附件”扩展。
你的方案
核心首先定义:
Asset / Storage例如:
Asset ├── id ├── name ├── mime ├── size ├── storage └── location然后:
Storage ├── put() ├── get() ├── delete() └── url()默认:
LocalStorage插件可以提供:
S3Storage OSSStorage WebDAVStorage ImageProxyStorage EncryptedStorage论坛附件只负责:
“我需要一个 Asset”而不是:
“我要把文件放到 app/upload/xxx”这时候你会突然获得非常大的自由度。
七、你说的“内核插件”尤其值得强调
你第二条:
“增设内核类插件规范,一些偏底层功能的插件应该能够被调用或者也有被钩子修改的定义”
我认为这是四条里面最关键的一条。
因为普通插件和你设想的东西其实不是一个等级。
现在的插件更接近:
Core ↓ Plugin ↓ 增加功能而你想要的是:
Core ↓ Core API / Capability ↓ Infrastructure Plugins ↓ Application Plugins ↓ UI Plugins例如:
Storage Plugin Search Plugin Cache Plugin Queue Plugin Notification Plugin Image Processing Plugin Authentication Plugin Markdown Plugin Editor Plugin然后普通插件调用这些能力。
这就形成一个非常漂亮的生态:
┌── Forum ├── Blog Core Capabilities ──┼── Wiki ├── File Manager └── Gallery而不是:
Forum Core ├── Forum Plugin ├── Forum Attachment Plugin ├── Forum Image Plugin └── Forum Whatever Plugin八、甚至可以进一步解释“内核类插件”和普通插件的区别
我建议你跟作者沟通的时候不要只说“底层插件”。
可以定义成两个层级:
Infrastructure Plugin
提供能力:
Storage Search Cache Queue Mail Image Authentication特点:
- 不负责具体论坛页面
- 可以被其他插件调用
- 提供明确 API
- 可以有默认实现
- 可以被替换
Feature Plugin
提供功能:
点赞 收藏 勋章 投票 积分 标签 商城特点:
- 调用 Core / Infrastructure API
- 面向用户
- 自己决定 UI
- 可以依赖其他能力
这样架构就非常清楚。
九、但是我不完全赞成“所有东西都 Hook”
这是我对你这个方案唯一比较大的保留。
Hook 不是抽象的同义词。
比如:
$user = user_by_id($uid);没必要变成:
$user = hook('user.load', ...);因为这样会产生一个问题:
代码越来越不可预测。
传统代码:
A → B → C你可以直接读懂。
全 Hook 后:
A ↓ Hook ↓ Plugin X ↓ Hook ↓ Plugin Y ↓ Hook ↓ Plugin Z ↓ B开发者很难知道:
“这个值到底是谁改的?”
而且还会产生:
- 调用顺序问题
- 插件之间依赖
- 性能开销
- 调试困难
- 类型约束弱
- 隐式控制流
- 安全边界不清晰
所以我会把你的思想修正成:
不要追求“全 Hook”,而应该追求“核心能力全部有清晰的抽象边界;需要动态扩展的地方使用 Hook,需要替换实现的地方使用接口/Provider,需要通知其他模块的地方使用 Event”。
这个表非常适合解释:
需求 机制 修改一个值 Filter / Hook 通知发生了某件事 Event 替换底层实现 Interface / Provider 增加页面 Route 增加 UI Slot / Component 提供基础能力 Service / Capability 改变业务规则 Policy / Hook 完全替换模块 Driver / Provider 这比“全部 Hook”成熟很多。
十、而且这个 v9.1 已经暴露出“Hook 正在承担太多职责”
从源码来看,它已经同时存在:
Hook Fire/Event Route Plugin Entry data-slot assets所以实际上作者已经开始形成一个“小型扩展平台”。
但是目前这些东西还是建立在:
核心本身已经决定了论坛长什么样。
例如开发规范里已经有大量:
topic.actions topic.after_render reply.after_render topic.content_after reply.content_after topic.title_suffix user.profile_tabs topic.index_tabs topic.toolbar_actions ...这些都是非常典型的:
“给现有 UI 打洞。”
这套方法对于保持 v9.x 稳定性非常好。
但它的上限也很明显。
如果未来想做完全不同的论坛 UI:
传统论坛 Discord 风格 Reddit 风格 知识库 问答社区 图片社区 移动端 SPA API-only插件就会越来越依赖:
topic reply sidebar top bar profile tab toolbar于是最终还是:
“换皮,但没有真正换架构。”
这正好对应你说的:
“在创作过程中都要考虑论坛现在长什么样,非常限制想象力。”
这个批评我认为是成立的。
十一、你第四条其实可以说得更漂亮
你现在写:
“内核不需要知道你的实体界面长什么样,只定义有什么元素,然后怎么交互”
我建议改成一个更架构化的表达:
内核应该定义语义和能力,而不是定义最终呈现形式。
例如内核只需要知道“这里有一个主题列表”“这里可以执行回复”“这里存在用户身份”“这里需要一个附件存储能力”,而不应该要求插件必须把这些东西呈现成当前版本的主题卡片、回帖楼层、侧栏或 Tab。
UI 层只负责把这些语义映射成具体界面。
这就非常强了。
因为它已经接近:
Domain ↓ Application ↓ Capability ↓ Presentation而不是:
PHP ├── 查询数据库 ├── 判断权限 ├── 处理业务 ├── 拼 HTML ├── 输出 CSS └── 顺便 Hook十二、你提的“参数不要定死”,我也赞同,但需要换个说法
你说:
“觉得一些参数定死太定制化了。”
这个其实不是“参数”问题,而是:
核心把实现细节当成了业务契约。
例如:
附件必须存在某目录 主题一定有某种 HTML 用户头像一定由某种 URL 生成 主题列表一定长成某种结构 后台一定使用 Tab这些东西一旦进入 Core API,就会变成:
事实标准。
以后再想改变非常困难。
所以你真正希望的是:
核心 API 应该暴露“语义”,而不是暴露“当前实现的结构”。
这是一个非常专业的架构观点。
十三、但我反而不建议作者现在直接做第 4 步
如果我是给这个项目提架构建议,我会非常明确:
不要现在重写。
因为 README 自己已经把项目的优势写得很清楚:
单核心、无框架、无 Composer、纯原生 PHP、跨数据库、低成本部署。
这意味着它的价值之一就是:
简单。
如果突然为了“完美架构”变成:
Core ↓ DI Container ↓ Service Provider ↓ Repository ↓ Domain ↓ Event Bus ↓ Message Bus ↓ Renderer ↓ Adapter ↓ ...那很可能把项目最珍贵的东西搞没了。
所以你第一段:
“任何重构建议都会显得不现实,因为总会破坏现有的稳定性。”
这个判断非常成熟。
十四、真正适合这个项目的路线其实是“渐进式抽象”
我会建议作者:
Phase 1:Hook 化
现在正在做的。
硬编码 ↓ 稳定 Hook例如:
topic.before_save topic.after_save reply.after_save avatar.url markdown.renderPhase 2:能力 API 化
把反复被插件需要的基础能力抽出来:
Storage Cache Search Notification Image Mail Queue例如:
storage_put() storage_get() storage_delete() storage_url()核心提供默认实现。
Phase 3:Provider 化
再让这些 API 的实现可替换:
Storage ├── LocalStorage ├── S3Storage └── CustomStorage此时甚至不需要改论坛业务。
这就是关键:
抽象应该在使用者不知情的情况下逐步建立。
Phase 4:UI Slot 化
现在已经有:
data-slot这其实是很好的方向。
继续发展成:
semantic slots而不是:
CSS / DOM slots例如:
topic.actions topic.meta topic.content topic.author topic.footer而不是:
topic.after_render后者还是 HTML 思维。
前者已经开始接近组件/语义思维。
Phase 5:Presentation 可替换
最后才可能出现:
Core ↓ Forum semantics ↓ Renderer A Renderer B Renderer C这时候才是真正意义上的:
论坛核心不关心论坛长什么样。
十五、所以你的“全 Hook”其实应该改成“全边界”
这是我认为最适合你表达的一个概念。
不是:
Everything is Hook
而是:
Everything important has a boundary.
比如:
用户 ↓ User Capability 帖子 ↓ Content Capability 附件 ↓ Storage Capability 搜索 ↓ Search Capability 通知 ↓ Notification Capability 页面 ↓ Presentation Capability每个能力都有:
输入 输出 生命周期 权限 错误 扩展点 默认实现 替换机制这才是真正的“灵活”。
十六、你的“传统方案 vs 全 Hook/抽象方案”可以这么概括
传统方案
Core owns implementation Core ├─ User ├─ Topic ├─ Reply ├─ Attachment ├─ Search └─ HTML Plugin └─ Hook into Core优点:
- 简单
- 性能容易预测
- 调试容易
- 稳定
- 小型项目非常合适
缺点:
- 扩展能力受核心结构限制
- 插件容易依赖内部实现
- UI 和业务容易耦合
- 替换基础设施困难
- 长期会出现越来越多 Hook
你设想的方案
Core defines capabilities ┌─ Storage ├─ Search ├─ Notification ├─ Authentication Core API ────┼─ Content ├─ User └─ Presentation ↓ Providers / Plugins ↓ Hooks / Events ↓ UI / Features优点:
- 插件自由度非常高
- 基础能力可替换
- UI 不再绑死
- 不同类型社区可以共用核心
- 第三方开发者想象空间大
- 更容易产生插件生态
缺点:
- 架构复杂
- 学习成本提高
- API 契约必须稳定
- 调试难度提高
- 生命周期管理困难
- 插件之间可能产生依赖地狱
- 不适合一次性“大爆改”
所以它不是:
“新方案全面优于传统方案。”
而是:
传统方案优化的是“核心稳定性”,你的方案优化的是“核心作为平台时的可组合性”。
这是两种不同的目标。
十七、我甚至觉得你最值得强调的一句话是这个
你现在说:
“在现有的基础上改改改”
我会把它提升成:
现在的插件机制解决的是“如何在现有论坛上增加功能”,而我更希望未来解决的是“如何让核心只提供能力,从而允许插件重新定义论坛是什么”。
这句话基本把你全部思想说完了。
前者:
论坛是什么 ↓ 插件在上面加东西后者:
核心提供能力 ↓ 插件组合能力 ↓ 论坛只是其中一种产品形态这个区别非常大。
十八、不过你还有一个地方需要警惕:不要“抽象泄漏”
比如作者为了做到完全抽象,可能搞出:
$element['type'] = 'topic'; $element['author'] = ... $element['actions'] = ... $element['html'] = ...最后核心虽然“不输出 HTML”,但实际上:
核心已经把当前论坛 UI 的数据结构重新定义了一遍。
这叫“假抽象”。
真正的抽象应该是:
Topic ├── identity ├── author ├── content ├── permissions ├── actions └── lifecycle至于:
怎么显示 显示在哪 显示成卡片还是楼层 按钮还是菜单 PC 还是移动端不应该由 Domain/Core 决定。
所以你第四层真正的终点并不是:
“所有东西变成 Hook。”
而是:
核心拥有稳定的语义模型,表现层拥有自由的实现方式。
十九、如果让我替你给作者的建议打分
我会这样评价:
第一条:增加 Hook
9/10
风险低,收益高。
尤其这个项目现在已经有很好的 Hook 基础。
第二条:内核类插件
10/10
我认为这是最值得推动的。
因为它决定插件生态到底只是“功能外挂”,还是最终可以形成“能力生态”。
第三条:实体全部抽象
8/10
方向对,但“实体”这个词需要改成:
领域能力 / 语义对象 / 基础设施
否则容易过度抽象。
第四条:内核与呈现彻底分离
10/10(长期目标)
但是:
现在不应该直接做。
应该通过前面三步慢慢演化出来。
二十、如果你要继续跟作者讨论,我建议不要再说“全 Hook”
你可以把你的核心观点压缩成下面这一版。
我想了一下,我前面说的“全 Hook”其实表述得不太准确。我真正想表达的不是“所有东西都变成 Hook”,而是希望核心逐渐从“定义论坛现在是什么样”转向“定义论坛提供什么能力”。
现在的 Hook 机制已经很好地解决了“在现有论坛上增加功能”的问题,比如 topic、reply、user、markdown、search、UI slot 等都有扩展点。但这种模式本质上还是“核心先定义实体和界面,插件再在旁边挂 Hook”。长期来看,插件的想象空间还是会被当前论坛的实体结构限制。
我比较理想的方向是把“能力”和“实现”逐渐分开。
例如附件/文件管理,我觉得本地存储作为默认实现完全没问题,也不应该因为它廉价就认为这个基础功能不完善。真正值得抽象的是“存储”这个能力:核心只需要定义存储、读取、删除、URL 等能力,本地文件系统只是默认 Provider。以后可以有 S3、OSS、WebDAV 等实现。这样其他插件如果需要文件能力,就直接调用这个基础能力,而不是自己再扫描 app/upload/ 或重复实现文件管理。
类似的还可以逐渐抽象 Search、Cache、Notification、Mail、Image、Queue 等基础能力。这样插件可以分成两层:一类是提供基础能力的 Infrastructure Plugin,另一类是调用这些能力实现具体功能的 Feature Plugin。
再往后,论坛本身的 Topic、Reply、User 等也可以逐渐从“固定实体 + 固定页面”变成比较稳定的语义模型。核心定义“有什么能力、允许什么操作、生命周期是什么”,而不是规定最终一定要显示成现在这样的帖子卡片、Tab、侧栏、工具栏。
所以我想表达的其实不是:
Everything = Hook
而更接近:
Everything important has a stable abstraction boundary.
需要修改值的地方用 Hook/Filter,需要通知其他模块的地方用 Event,需要替换底层实现的地方用 Provider/Interface,需要增加页面就用 Route,需要扩展 UI 就用 semantic slot。
这样做的好处是,现有版本完全可以继续保持现在的简单和稳定,不需要一次性重构。可以先增加 Hook,再把高复用的底层能力抽出来,再逐步 Provider 化,最后才有可能做到核心和 Presentation 真正解耦。
我觉得这样可能比“不断给现在的论坛结构打更多 Hook”更有长期价值。
因为前一种思路解决的是:
“怎么在这个论坛上继续加功能?”
而后一种思路最终解决的是:
“核心提供这些能力之后,论坛究竟应该长什么样,可以由实现者自己决定。”
我比较倾向后者,但也完全理解这只能作为长期演进方向,不适合为了架构纯粹性直接重写现有核心。
我觉得这一版比你原来的表述更容易让作者接受,因为它没有否定现有架构,也没有把“抽象化”描述成一次大重构,而是把它定义成一个长期演进方向。
另外,从你给我的这个 v9.1 看,我会特别建议你以后不要再把“Hook 越多越好”作为主要论点。源码现在其实已经证明 Hook 数量不是核心矛盾了——它已经有相当多 Hook。真正的瓶颈是“Hook 背后的对象和能力仍然由核心预先实体化”。 你真正抓到的点,是从 extension points(扩展点) 进一步走向 replaceable capabilities(可替换能力)。
这其实是比“多加 Hook”高一个层次的架构讨论。
主楼好长的内容
对于非 UI 类插件,比如事件钩子、数据处理、权限逻辑这类,确实不需要绑定页面布局,怎么改造界面都影响不大。但 UI 类插件是需要在页面上渲染组件、按钮、入口、面板的,如果界面 DOM 结构可以随意删除、任意重构,第三方插件就没有稳定可靠的位置去渲染自己的内容。
当然我们也不需要强制卡死物理布局,例如硬性规定侧边栏必须固定在页面左侧。合理的方案是约定一套逻辑插槽契约:定义好若干命名扩展点位,比如侧边栏顶部、帖子工具栏、主题底部、导航栏等逻辑槽位。主题模板可以自由决定这个插槽最终渲染在左边、右边、底部抽屉,也可以自由修改样式、标签,但不能删除约定好的逻辑插槽标识。
插件只需要声明自己要挂载到哪个逻辑插槽,不用关心插槽最终的物理位置。如果连这套逻辑挂载契约都没有,每个人都随意改动页面结构,第三方 UI 插件就会频繁出现错位、消失、无法兼容的问题,插件生态很难发展起来。
太长了,后面实在看不下去了!理解的就只有2点1、基础底子要尽量的可以在后台改,2、要更开放,我想要改的都能用插件改。
太长了,浓缩一下
问一下,咱这项目以后还上github吗
当然ai的回答只能当作参考,你把依托大便喂给它,它也能说哪部分是香的,主要部分是我前面把我的感受描述出来而已
我的ai给总结的:
💡 核心论点:从“扩展点”走向“可替换能力”有个叫 bbc 的用户提出了一个非常深刻的架构进化方向:论坛的核心不应该只知道“论坛长什么样”,而应该知道“论坛提供什么能力”。
- 他的四级演进路线:
· 第一级:在现有的“论坛实体”上增加更多的 Hook。
· 第二级:增设内核类插件,把偏底层功能(如存储、搜索、通知)插件化。
· 第三级:把能看到的实体化元素全部抽象化(比如附件不再是“本地文件”,而是“可存储的对象”)。
· 第四级:内核与呈现彻底分离,内核只定义“有什么元素”和“怎么交互”,不规定长什么样。- 他举了一个绝佳的例子:文件管理
· 传统做法:核心规定“附件就是 app/upload/ 下的文件”。
· 他的做法:核心只定义 Store 能力(读、写、删、URL),本地文件只是默认实现。以后可以换成 S3、OSS、WebDAV,甚至不依赖文件系统。这样“附件”这个能力的想象空间就被彻底打开了。- 他反对“全 Hook”,提倡“全边界”
· 他特别强调,不要搞“Everything = Hook”,因为那会导致代码不可预测、插件之间产生依赖地狱。
· 他提出了一个非常成熟的概念:“Everything important has a stable abstraction boundary(所有重要的东西都有稳定的抽象边界)。”
· 修改值 → 用 Hook / Filter
· 通知事件 → 用 Event
· 替换底层实现 → 用 Provider / Interface
· 增加页面 → 用 Route
· 扩展 UI → 用 Semantic Slot💡 BBS1 官方(bbs1org)的精彩回应:关于 UI 插件的兼容性
官方回应极其精辟,直接解决了“完全抽象”在实践中最大的痛点:
- UI 插件的“稳定性”和“逻辑插槽契约”
· 官方说:非 UI 类插件(如数据处理、权限逻辑)确实不用绑定页面布局,怎么改界面都无所谓。
· 但是:UI 类插件必须在页面上渲染组件、按钮、面板。如果界面的 DOM 结构可以随意删除,第三方插件就没有稳定的位置去渲染内容了。- 官方提出了一个完美的折中方案:逻辑插槽(Logical Slot)
· 核心约定好命名扩展点位(如:侧边栏顶部、帖子工具栏、主题底部、导航栏等)。
· 主题模板可以自由决定这个插槽渲染在左边、右边还是底部抽屉,也可以修改样式。
· 但是:不能删除逻辑插槽的标识。
· 插件只需要声明“我要挂载到这个逻辑插槽”,不需要关心它最终在哪里。这就既保证了 UI 插件的稳定性,又留足了主题定制的自由度。💡 最终的核心共识
结合 bbc 的“能力抽象”和 bbs1org 的“逻辑插槽”,他们讨论出的最优演进方向其实是:
第一层(地基):核心把“存储、搜索、缓存、通知、邮件、图片”这些基础能力抽成独立 API(提供默认实现)。
第二层(能力插件):提供这些基础能力的插件成为“基础设施插件”(Infrastructure Plugin),其他插件直接调用它们,不再重复造轮子。
第三层(UI 插件):UI 插件通过“逻辑插槽”挂载,保证无论主题怎么改,插件都能找到自己的位置。
好长
支持