Flarum 2.0.0-beta.8 发布公告 🎉
Beta.8 是一个重大版本。在早期测试版奠定的基础设施基础上,此版本包含大量新功能、一次主要的图标库升级、有意义的性能提升,以及一长串的修复和优化。这是我们为 2.0 版本发布的功能最丰富的测试版。
👀 您正在体验它。这个论坛本身 —— discuss.flarum.org.cn
🧪 想在正式投入前试用 Flarum 2.0?请查看我们的每日构建演示站点 nightly.flarum.site,该站点每天都会从最新的 2.x 代码分支重新构建。
🚨 Beta.8 是 RC 版本发布前的最后一个功能版本。 2.x 分支现在进入仅修复错误的冻结状态 —— 将不再合并任何新功能。2.0.0-rc.1 计划于 2026 年 4 月 20 日发布。如果您一直在等待测试 Flarum 2.0,现在正是时候。
🆕 Beta.8 中有哪些新内容?
⚠️ 新的 PHP 版本要求
由于此版本升级了 Laravel,Flarum 2.0 现在的最低 PHP 版本要求为 8.3
支持的版本为:8.3, 8.4 和 8.5
🎨 FontAwesome 7.x
Flarum 现在搭载了从 6.5.2 升级而来的 FontAwesome 7。FA7 带来了焕然一新的图标集、更清晰的包结构,并为将来所有图标的添加奠定了基础。对扩展开发者来说的好消息是:.fas / .far / .fab 类别名得以保留,因此现有的图标类字符串无需更改即可继续工作。
伴随此次升级,FontAwesome CDN/Kit 现在以非阻塞方式加载,因此它不会再阻止页面渲染 —— 这对于依赖 CDN 获取专业版图标的论坛来说是一项有意义的改进。
⚡ CSS 异步加载
现在样式表以异步方式加载,以消除渲染阻塞 CSS。这意味着浏览器可以更早地开始渲染页面,减少感知加载时间 —— 在首次访问或缓存为空时尤其明显。
🔔 实时功能:扩展器 API、每个扩展的集成和通知提示框
实时(realtime)扩展已进行重大重构。扩展现在可以通过专用的 Realtime 扩展器来接入它们自己的实时行为,而无需让实时扩展硬编码了解每个扩展。
在实际应用中这意味着:
flarum/flags, flarum/likes, flarum/lock 和 flarum/messages 现在都处理自己的实时推送事件。
- 一个新的
NotificationToast 组件会在屏幕右上角以自动消失的提示框形式显示传入的通知 —— 当您在浏览时,会实时看到这些通知提示出现。
🖼️ WebP 图片转换
Flarum 现在会自动将上传的头像和 Logo 转换为 WebP 格式 —— 这是一种现代图片格式,通常比 JPEG/PNG 小 30–50%,且没有可见的质量损失。我们提供了一个批量迁移命令来转换现有的头像。Logo 现在也支持动画 GIF 和新的深色模式 Logo 设置。
🔒 OAuth 改进
OAuth 流程已被重写为仅使用重定向的模式。这是一项安全改进,并修复了先前方法中响应类型可能变化的边缘情况。
📋 管理面板新增功能
- 管理仪表盘上的公告(Announcements)小部件 —— 直接在管理面板中让您的团队了解最新信息。
📳 触觉反馈
移动用户现在在进行关键交互(如按钮点击)时会获得触觉反馈,并提供了用户偏好设置以在需要时禁用它。此功能已扩展到核心和捆绑的扩展中。
📦 Laravel 13
Flarum 的 Illuminate 组件已升级到 Laravel 13。遵循标准模式的扩展无需进行任何更改。
🌊 IdWithDisplayNameSlugDriver
一个新的 Slug 驱动,它将模型的 ID 与其显示名称结合 —— 为您提供即使显示名称更改也能保持稳定的、人类可读的 URL。可用于讨论、用户、标签和提及。
📧 邮件改进
- Postmark 现在是一个开箱即用的邮件驱动。
- 发送失败现在会被记录并触发
EmailSendFailed 事件,这使得诊断邮件投递问题变得更加容易。
🌐 其他杂项新增功能
- 登出现在是 POST 请求(安全改进 —— 防止基于 CSRF 的登出)。
- 用于模态框和下拉菜单的新
CloseWatcher API 在可用时使用浏览器原生的返回手势/Escape 键处理。
- 用于自定义页面的可复用
Hero 组件。
- 可自定义的用户头像驱动 —— 扩展现在可以注册自己的头像来源。
- (gdpr) PII 字段声明、匿名化上下文支持、确认令牌失效、IP 记录和清除,以及针对已取消擦除请求的保护措施。
- (package-manager) 现在直接搜索 Packagist 而不是 flarum.org API;拒绝与当前 Flarum 主版本不兼容的扩展。
- (subscriptions) 创建时自动关注讨论。
- (realtime) 通知提示框的持续时间现在可以从管理面板配置;设置为 0 可完全禁用提示框。
- (install) 安装程序现在直接支持队列驱动配置。
- PostgreSQL 的
search_path 现在可为多 schema 设置进行配置。
🔧 修复与优化
Beta.8 也包含了迄今为止所有测试版中最多的修复。亮点如下:
📱 移动端布局
移动端的帖子现在具有对称的水平内边距,修复了因隐藏头像列造成的视觉不对称问题。
🔔 通知对比度
未读通知现在在通知下拉菜单中有一个清晰的、使用主题色的左边框,改善了在深色模式下的可读性,因为之前仅靠背景对比度是不够的。
🔍 搜索与提及
- 用户搜索现在在所有支持的数据库中都是不区分大小写的。
- 当标签或组未设置图标/颜色时,提及功能不再崩溃。
- 解决了提及功能中一个“编辑器就绪”的竞争条件,无需之前那个随意的超时变通方法。
- 搜索中的
AuthorFilter 现在使用 SlugManager,因此自定义 Slug 驱动会被正确识别。
🏷️ 其他修复
- 隐藏标签中的置顶讨论不再出现在“所有讨论”页面上。
- 管理下拉菜单(维护模式、slug 驱动、FontAwesome 源)现在能在全新安装和升级安装中正确显示其默认值。
- 在运行
php flarum migrate 期间,扩展的启动顺序会被重新排序,因此在执行 composer update 后,新的可选依赖声明会生效,无需手动启用/禁用的循环。
- 删除用户帐户现在也会从磁盘中删除其头像文件。
- 表情符号更新到 Unicode 17。
🔐 安全
- 显示名称现在在 HTML 通知邮件中进行清理,以防止注入(昵称扩展)。
- 通知查询范围限定为已认证用户。
- 包管理器的任务列表端点限制为管理员可访问。
🛠️ 面向开发者
- 修正了 LESS 混入(mixin)定义 ——
Button--block, Button--icon 等现在都是正确的参数化混入,修复了 FA Kit 图标对齐问题。
- 布尔型自定义 LESS 函数现在返回正确的
Less_Tree_Keyword 类型。
- 防止了异步默认导出的未捕获
ReferenceError。
- 修复了 jest-config 中的
src/bootstrap/ 拼写错误(原为 src/boostrap/)。
- 恢复了“跳转到内容”链接的可见性。
🌍 生态系统正在准备就绪
随着 RC1 定于 2026 年 4 月 20 日发布,生态系统的推动工作正在全面展开。
🌐 语言包 —— @rob006 继续推动 2.0 的语言包更新。如果您是翻译维护者,请关注那些相关讨论帖。
🤝 Flarum 之友 (Friends of Flarum) —— FoF 扩展在适配 2.0 方面取得了很大进展,只剩下少数几个扩展待完成。感谢所有参与者。
📣 扩展开发者 —— API 现在已经冻结。如果核心中的某些内容阻碍了您的扩展更新,请立即开启讨论或提交 issue —— 在 4 月 20 日 RC1 发布之前,我们仍然接受错误修复,但这是您最后的时机。
🚀 亲自尝试
- 🖥️ 在线演示 —— nightly.flarum.site,每日重建
- 👁️ 就在此处 —— discuss.flarum.org 正在运行 beta.8
- ⬆️ 更新您的安装 —— 运行
composer update -W,接着执行 php flarum migrate 和 php flarum cache:clear,最后运行 php flarum assets:publish(和往常一样,先在预发布环境和备份后操作)
💙 感谢
Beta.8 拥有的社区贡献比任何之前的 2.0 测试版都多 —— 感谢每一位提交拉取请求的人。
- @datlechin (GitHub) —— 可自定义用户头像驱动 #4130,为无密码驱动跳过密码检查 #4435
- @davetodave178 —— 可复用
Hero 组件 #4215,IdWithDisplayNameSlugDriver #4470
- @rafaucau (GitHub) ——
CloseWatcher API #4433,深色模式 Logo 支持 #4457,防止异步默认导出的未捕获 ReferenceError #4397,为 Alert 组件添加缺失的 content 属性类型 #4495
- @edgeinfinity1 (GitHub) —— 标签变更(mutation)改进 #4393
- @grimur82 (GitHub) —— GDPR 针对已取消擦除请求的保护措施 #4387
- @johannsa (GitHub) —— PostgreSQL
search_path 支持 #4241
- @huoxin233 (GitHub) —— 创建时自动关注讨论 #4464
- @IanM —— 其他所有内容
📋 更新日志
新增
- (realtime) 扩展器 API、每个扩展的集成和通知提示框,作者 @IanM #4473
- (admin) 管理仪表盘上的公告小部件,作者 @IanM #4471
- (admin) 可折叠的扩展分类、健康小部件及废弃包支持,作者 @IanM #4392
- (core, mentions, likes) 实现
IdWithDisplayNameSlugDriver,作者 @davetodave178 #4470
- (core) 仅重定向的 OAuth 流程 —— 重写
ResponseFactory,作者 @IanM #4461
- (core) 用于模态框和下拉菜单的
CloseWatcher API,作者 @rafaucau #4433
- (core) 触觉反馈用户偏好和工具函数,作者 @IanM #4430 #4434
- (core) 可复用的
Hero 组件,作者 @davetodave178 #4215
- (core) 可自定义的用户头像驱动,作者 @datlechin #4130
- (core) 将上传的头像转换为 WebP,添加批量迁移命令,作者 @IanM #4431
- (core) 将上传的 Logo 转换为 WebP,支持动画 GIF,作者 @IanM #4458
- (core) 添加深色模式 Logo 支持,作者 @rafaucau #4457
- (core) 将登出从 GET 改为 POST,作者 @IanM #4448
- (core) 将 FontAwesome 从 6.x 升级到 7.x,作者 @IanM #4388
- (core) 非阻塞加载 FontAwesome CDN/Kit,作者 @IanM #4463
- (core) 异步加载 CSS 以消除渲染阻塞样式表,作者 @IanM #4462
- (gdpr) PII 字段声明和匿名化上下文支持,作者 @IanM #4396
- (gdpr) 移植确认令牌失效、IP 记录和 IP 清除功能,作者 @IanM #4423
- (mail) 添加 Postmark 驱动,作者 @IanM #4455
- (mail) 记录发送失败并触发
EmailSendFailed 事件,作者 @IanM #4385
- (package-manager) 用 Packagist 搜索替换 flarum.org API,作者 @IanM #4394
- (tags) 修复标签变更显示“[已删除]”及相关改进,作者 @edgeinfinity1 #4393
- (realtime) 使通知提示框持续时间可配置;设为 0 禁用提示框,作者 @IanM #4497
- (subscriptions) 添加创建时自动关注讨论的支持,作者 @huoxin233 #4464
- (install) 在安装程序文件中支持队列配置,作者 @IanM #4484
- (core) 添加对 pgsql
search_path 的支持,作者 @johannsa #4241
修复
- (core) 各种样式修复:移动端帖子内边距、未读通知对比度、主要按钮文字颜色,作者 @IanM #4480
- (realtime) 恢复全宽的新活动横幅;将状态移至
IndexPage,作者 @IanM #4481
- (core) 使用户搜索在所有支持的数据库中不区分大小写,作者 @IanM #4467
- (core) 规范化管理仪表盘中的数据库版本字符串,作者 @IanM #4466
- (core) 在更新页面为无密码驱动跳过密码检查,作者 @datlechin #4435
- (core) 为错误视图添加缺失的
method_not_allowed 翻译,作者 @IanM #4418
- (core) 切换语言环境时保留翻译,作者 @IanM #4400
- (core) 为布尔型自定义 Less 函数返回
Less_Tree_Keyword,作者 @IanM #4406
- (core) 防止异步默认导出的
Uncaught ReferenceError,作者 @rafaucau #4397
- (core) 在 App 组件中使用正确的
--page-bottom-padding CSS 变量,作者 @IanM #4438
- (core) 为主要按钮使用基于亮度的文字颜色以确保对比度,作者 @IanM #4451
- (core) 为移动端帖子添加左内边距,作者 @IanM #4422
- (core) 将移动端帖子的水平内边距减少到 15px,作者 @IanM #4456
- (core) 如果还有更多子元素,防止在帖子流末尾出现
<hr>,作者 @IanM #4460
- (core) LESS 混入定义和“跳转到内容”链接的可见性,作者 @IanM #4389
- (core) 为“无”加密禁用
auto_tls,添加 SSL 证书验证绕过,作者 @IanM #4445
- (approval) 将透明度应用于整个未批准的帖子,而非子元素,作者 @IanM #4453
- (formatter) 在
HasFormattedContent 和提及解析器中处理 null 内容,作者 @IanM #4452
- (gdpr) 添加 GDPR 针对已取消擦除请求的保护措施,作者 @grimur82 #4387
- (jest-config) 将
src/boostrap/ 重命名为 src/bootstrap/ 并更新所有导入,作者 @IanM #4413
- (less) 修复 FA Kit 图标对齐和杂乱的图标回归问题,作者 @IanM #4409
- (mentions) 防止当标签或组没有图标/颜色时崩溃,作者 @IanM #4447
- (mentions) 解决“编辑器就绪”竞争条件,无需随意的超时处理,作者 @IanM #4411
- (messages) 在创建后刷新对话框消息以解决数字表达式问题,作者 @IanM #4384
- (nicknames) 清理显示名称以防止在 HTML 通知邮件中注入,作者 @IanM #4454
- (notifications) 将通知查询范围限定为已认证用户,作者 @IanM #4441
- (notifications) 在“全部删除”时使未读计数缓存失效,作者 @IanM #4390
- (package-manager) 拒绝与当前 Flarum 主版本不兼容的扩展,作者 @IanM #4412
- (package-manager) 限制任务列表端点仅管理员可访问,作者 @IanM #4410
- (search) 在
AuthorFilter 中使用 SlugManager 以支持自定义 Slug 驱动,作者 @IanM #4486
- (settings) 为管理下拉菜单设置注册缺失的默认值,作者 @IanM #4491
- (sticky) 隐藏标签中的置顶讨论出现在“所有讨论”页面,作者 @IanM #4492
- (user) 删除用户帐户时从磁盘删除头像文件,作者 @IanM #4485
- (core) 在初始化器错误闭包中按值捕获扩展名,作者 @IanM #4482
- (core) 为 Alert 组件添加缺失的
content 属性类型,作者 @rafaucau #4495
- (emoji) 更新到 Emoji/Unicode 17,作者 @datitisev #4489
变更
- 将 Illuminate 组件升级到 Laravel 13,作者 @IanM #4468
- (core) flarum-webpack-config 3.0.3,作者 @IanM #4398
- (core) 移除
Array.prototype.flat 的 polyfill,作者 @IanM #4483
- (extensions) 在迁移期间重新排序扩展启动顺序以获取新的可选依赖,作者 @IanM #4493