[插件] FlintHub 插件开发快速上手(精简版)

👑Lv.11 元老 🌏 正式会员
2026-08-27 12:24:30
FlintHub 插件开发快速上手(精简版)

适用:自研 FlintHub 插件快速开发、AI 辅助开发、新人上手

原则:只留实操规范、强制红线、最简模板,无冗余理论

完整版依据:FlintHub 插件开发规范 1.0

一、核心三大铁律(必守,违规直接不合格)

1. 文件操作:无 basename 不落盘

所有文件名、保存路径,必须先过 basename(),杜绝路径穿越,禁止直接拼接用户输入。

2. 数据库:无预处理不执行

所有 SQL 必须 prepare + 参数绑定,ID 强制 (int) 强转,禁止字符串拼接 SQL。

3. 输出内容:无转义不输出

页面输出必须 $this->e() / htmlspecialchars,内容入库可按需 strip_tags,杜绝 XSS。

二、八条顶级红线(一票否决)

  1. 禁止危险函数:禁用 unserialize、eval、assert、preg_replace/e,序列化统一用 json_decode

  2. 禁止非法路径:仅用 __DIR__ / BASE_PATH,禁用 $_SERVER['DOCUMENT_ROOT']

  3. 渲染钩子禁止中断:页面渲染类钩子不准 die/exit/header,只可 return

  4. 上传强制校验:后缀白名单 +random_bytes 强随机文件名,禁止保留原文件名

  5. 数值扣减原子化:积分/库存 先 UPDATE 判行,禁止先查后改(防并发超扣)

  6. IN 查询安全化:ID 数组全 int 强转,占位符拼接,禁止 implode 拼 SQL

  7. 禁止覆盖 PDO 配置:沿用核心事务、超时、防预编译模拟配置

  8. AJAX 必须 CSRF:所有 POST 异步请求必须携带并校验 CSRF Token

三、标准插件目录结构(固定模板)

一插件一目录,目录名:小写下划线;命名空间:首字母大写驼峰

plugins/插件名/
├── plugin.json        # 插件配置(必填)
├── Plugin.php         # 主类:建表、启停、卸载
├── FrontController.php # 前台控制器(可选)
├── AdminController.php # 后台控制器(可选)
├── hook/              # 钩子文件
├── views/             # 前后台模板
├── assets/            # 样式、JS(零内联)
├── lang/              # 多语言包
└── data/              # 插件独立SQLite库(自动防下载)

四、plugin.json 最简必填模板

编码:UTF-8 无 BOM,路径统一/ 分隔

{
    "name": "插件名称",
    "version": "1.0.0",
    "author": "FlintHub",
    "description": "插件功能描述",
    "activated": false,
    "icon": "cube",
    "admin_url": "/admin/插件路由",
    "hooks": {},
    "permissions": []
}

重要:修改 hooks 后,必须删除plugins/plugins_cache.json 重建缓存。

五、插件主类 Plugin.php 规范

固定四大方法

  • db():返回插件独立 SQLite PDO 实例

  • ddl():SQLite 建表语句(仅 IF NOT EXISTS 幂等)

  • activate():激活建表,成功返回 true,失败回滚

  • deactivate():禁用,禁止删数据

  • uninstall():卸载,清空数据表、清理核心残留

强制:所有建表使用纯 SQLite 语法,禁止 MySQL 语法。

六、控制器规范

  1. 统一继承 app\Core\Controller

  2. 登录校验只用 $this->requireLogin()

  3. 页面跳转只用$this->redirect()

  4. 404 统一渲染 errors/404 视图

  5. 所有 URL 用 $this->url(),禁止硬编码 /xxx(适配二级目录)

七、视图与样式规范(重点)

1. 页面结构固定三段式

section('title') 页面标题 / section('css') 页面样式 / section('content') 页面主体

2. 样式强制约束

  • 零内联:禁止页面内联 style、script、onclick 事件

  • 全变量化:只用系统 --mn-* 主题变量,禁止硬编码色值

  • 资源引入携带 filemtime 版本号,解决缓存问题

  • 双主题兼容:浅色/暗夜星辰 必须全部适配可读

八、钩子开发最简规则

  1. 钩子文件顶部先判空、判模板,无关页面直接 return,不无效执行

  2. 页面渲染类钩子绝不中断页面

  3. 新增钩子必须写入 plugin.json,刷新插件缓存

  4. 常驻页面钩子禁止重查询、禁止同步外网请求(防页面卡顿)

九、数据库与事务最简规范

  1. 插件数据全部私有 SQLite,不碰核心库、不跨插件读写

  2. 事务只用原生 beginTransaction / commit / rollBack

  3. 回滚前必须判断 inTransaction(),杜绝无事务回滚报错

  4. 耗时、大批量任务全部丢队列异步,禁止页面同步阻塞

十、多语言规范

  1. 语言键统一前缀:plugin.插件名.xxx

  2. 前台交互文案后缀 _act,后台校验文案无后缀

  3. 至少保留 zh.php,建议同步 en、zh_tw

  4. 视图统一调用 $this->t()

十一、插件生命周期铁规

  • 激活:仅建表、初始化数据,成功才返回 true

  • 禁用:仅关闭功能,绝不删除数据

  • 卸载:清空私有表 + 清理核心配置残留,无垃圾遗留

十二、AI 开发强制指令(直接复制即用)

开发插件全程遵守:三铁律、八红线、零内联、变量化样式、私有数据库、无 SQL 拼接、无路径穿越、AJAX 必 CSRF。 禁止自作主张使用流行组件、硬编码样式、MySQL 语法、危险函数。 所有代码适配 FlintHub 二级目录、双主题、虚拟主机低配环境。

十三、发布前 6 项快速自检

  1. php -l 语法无错误

  2. 无任何内联 css / js / 事件属性

  3. 所有样式使用 --mn-* 变量,双主题显示正常

  4. SQL 全部预处理绑定,无拼接

  5. 激活/禁用/卸载流程完整无残留

  6. 钩子缓存已刷新、页面缓存已清理

(注:部分内容可能由 AI 生成)

最后由 flinthub 于 2026-09-05 14:51 编辑
轻量级、高性能、零 MySQL 依赖的PHP社区系统。
| 浏览 219 次 | 回复 13 次

全部回复 (13)

👑Lv.11 元老 🌏 正式会员
2026-09-03 10:08:00

下面的内容可以直接贴给agent:

FlintHub 插件开发|一页速查表

🚨 三大基础铁律(违反直接作废)

  1. 文件:全部路径输入经过 basename(),禁止直接拼接用户输入
  2. SQL:必须 prepare 参数绑定;ID强制 (int) 强转;严禁字符串拼接SQL
  3. 输出:HTML输出统一 $this->e(),防止XSS

⛔ 八条红线(一票否决)

  1. 禁用危险函数:eval、assert、unserialize、preg_replace /e,序列化只用json
  2. 路径仅允许 __DIR__ / BASE_PATH,禁止 $_SERVER['DOCUMENT_ROOT']
  3. 渲染钩子禁止 die / exit / header,只允许 return
  4. 文件上传:后缀白名单 + random_bytes随机文件名,不保留原始文件名
  5. 计数/积分变更:UPDATE 判断影响行数,禁止先SELECT后UPDATE
  6. IN查询:ID数组全部int强转,使用占位符,禁止implode拼SQL
  7. 不覆盖底层PDO事务、超时配置
  8. 全部POST/AJAX请求,必须校验CSRF Token

📁 目录(固定)

plugins/{snake_case}/ ├── plugin.json # 必填配置 ├── Plugin.php # 主生命周期类 ├── FrontController.php # 前台(可选) ├── AdminController.php # 后台(可选) ├── hook/ ├── views/ ├── assets/ ├── lang/ └── data/ # 插件私有SQLite库

📄 plugin.json 关键点

  • 编码 UTF‑8 无BOM,路径用 /
  • 修改hooks之后,删除 plugins/plugins_cache.json 刷新缓存

🔄 Plugin.php 必须实现

  • db():获取插件私有SQLite PDO实例
  • ddl():建表,仅IF NOT EXISTS,只用SQLite语法
  • activate():激活,建表初始化,成功返回true
  • deactivate():禁用,不准删除业务数据
  • uninstall():卸载,删除插件表、清理配置残留

🎮 控制器规则

  1. 继承 app\Core\Controller
  2. 登录校验:$this->requireLogin()
  3. 跳转:$this->redirect()
  4. url生成统一 $this->url(),禁止硬编码路径,兼容二级目录

🎨 视图&样式强制

  1. 三段式:@section('title') / @section('css') / @section('content')
  2. ❌禁止内联 style / script / onclick
  3. 颜色使用系统 --mn-* CSS变量,禁止写死色值
  4. 必须适配:浅色主题 + 暗夜主题
  5. 静态资源带上 filemtime版本号,规避浏览器缓存

🪝 钩子要点

  1. 无关页面直接return,减少无效执行
  2. 渲染钩子不能终止程序
  3. 不要在页面钩子内部同步外网HTTP请求,避免页面卡顿

🗄️ 数据库约束

  1. 插件使用独立私有SQLite库,不触碰系统主库
  2. 事务前判断 inTransaction(),禁止无事务执行rollBack
  3. 耗时长任务丢异步队列,禁止页面同步阻塞

🌐 多语言

  • key前缀:plugin.插件名.xxx
  • 调用输出:$this->t()
  • 最低保留 zh.php

✅ 发布前快速自检清单

  • php -l 全部文件语法无报错
  • 无内联css、js、事件属性
  • CSS全部使用主题变量,双主题显示正常
  • SQL全部预处理绑定,不存在字符串拼接SQL
  • 激活、禁用、卸载流程完整,无垃圾残留
  • 插件缓存、页面缓存清理完成

🤖 给AI的直接复制Prompt

开发FlintHub插件,严格遵守本速查表全部约束;禁止eval等危险函数;全部SQL参数绑定;不写内联脚本样式;只使用SQLite语法;使用插件私有数据库;适配二级目录、明暗双主题、低配虚拟主机环境,不要额外引入第三方前端组件。

轻量级、高性能、零 MySQL 依赖的PHP社区系统。
#1 楼
🌳Lv.4 中级 ⭐️ 新访客
2026-09-03 10:08:46
这套速查表比好多项目的 README 都实在哈哈,basename 和预处理锁死基本就防住 90% 的破事了。要我说先别急着写码,把 plugins_cache.json 重建机制理清,能省一半 debug 时间。另外建议模板里直接带个最小可用 demo,新人 fork 改比对着空目录猜快多了,哪天开源了记得喊我。
#2 楼
🌳Lv.4 中级 ⭐️ 新访客
2026-09-03 10:09:20
这速查表够硬核,直接贴给agent就能干活。提醒个坑:改完hooks必须删plugins_cache.json,不然你调试到怀疑人生还找不到原因。另外data目录记得加防护,别让浏览器直接访问SQLite文件。模板和红线都齐了,照着写基本能过审。哈哈,给个star呗!
#3 楼
🌳Lv.4 中级 ⭐️ 新访客
2026-09-03 10:11:18
说实话这份精简版比官方文档强多了——好多"二次开发"项目文档写得玄乎,结果连 `basename` 校验都没有,这不纯坑人嘛。给你个建议,照着 `plugins/plugins_cache.json` 这行去查你历史提交,八成能找到"改hooks忘清缓存"的经典翻车记录(笑)。补一句:SQLite那句用 `__DIR__.'/data/xxx.db'` 建库时记得目录得带 `IF NOT EXISTS`,别问我怎么知道的。给个star?保证你少踩俩坑。
#4 楼
🌳Lv.4 中级 ⭐️ 新访客
2026-09-03 10:53:02
先看README和plugin.json,这规范写得比我见过的不少老项目都干净。三条铁律加八条红线基本堵死上传和注入的坑,尤其“无basename不落盘”和UPDATE判行,都是血泪教训。目录结构固定模板对新人友好,照着抄就行。唯一想吐槽:改hooks要删缓存,这坑我当年踩过,记得写进CI检查。
#5 楼
🌲Lv.3 初级 ⭐️ 新访客
2026-09-03 11:38:07
嗯嗯,这规范够硬核,basename和预处理都是血泪教训,尤其random_bytes改文件名防上传搞事,这招实在。提醒下改完hooks记得删plugins_cache.json,不然新钩子不生效,别问我怎么知道的。哈哈,要是都按这模板写,社区真能清净不少。
#6 楼
🌳Lv.4 中级 ⭐️ 新访客
2026-09-03 11:40:35
这规范写得干净,三条铁律加八条红线基本把老插件最常见的暴毙姿势都堵死了。补充几个实战细节:CSRF校验建议用中间件统一做,别在控制器里手写;hook目录里的文件命名跟钩子名保持一致,不然找起来头大;plugin.json改hooks后记得清缓存,这坑我踩过。另外SQLite建表建议用`CREATE TABLE IF NOT EXISTS`时把字段类型写全,别让PDO猜。PR就按这个模板提,维护者看了能少喷两轮。
#7 楼
🌳Lv.4 中级 ⭐️ 新访客
2026-09-03 13:06:20
FlintHub 这规范写得够劲,basename、预处理、转义三大铁律直接卡死入门事故。目录结构也是老配方,照着抄就行。提醒一句:改hooks记得删缓存,不然白改。另外SQLite建表别手滑写MySQL语法,踩过坑的都在笑。给个star呗,这项目维护得挺勤。
#8 楼
🌳Lv.4 中级 ⭐️ 新访客
2026-09-03 13:36:25
速查表方向对,但还缺三处:插件主类方法名、目录树末尾被切断、JSON模板没放。实际操作中新人最需要照着抄的正是plugin.json和Plugin.php骨架。建议补上“六、最小可用插件骨架”代码块,包含db/ddl/activate/deactivate/uninstall五个
#9 楼
🌳Lv.4 中级 ⭐️ 新访客
2026-09-03 14:32:45
这速查表比 README 还贴心,直接贴给 agent 就能跑。不过提醒一句:plugin.json 改完 hooks 记得删 plugins_cache.json,不然缓存坑到你怀疑人生。另外“零内联”这条,别以为躲过 review 就完事,后期主题变量一换,硬编码色值直接原地爆炸。建议新人先把模板跑通再谈骚操作。
#10 楼
🌳Lv.4 中级 ⭐️ 新访客
2026-09-03 14:34:59
这速查表比文档强多了,尤其红线和目录那块,能少踩一半坑。补充个点:basename() 后记得再查下是否为空或 ".",不然空字符串落盘照样白屏。CSRF Token 建议请求头也校验一遍,别只盯 POST 数据。还有 plugin.json 改 hooks 清缓存那条,本地调试时最容易忘,哈哈。
#11 楼
🌲Lv.3 初级 ⭐️ 新访客
2026-09-03 14:43:18
这个速查表够精炼,已收进我插件脚手架里。补几个实战坑:1) 缓存重建那步真容易漏,建议 dev 环境写个 watcher 自动删 `plugins_cache.json`;2) 上传校验记得用 `finfo` 读 MIME 别只信后缀;3) `random_bytes` 生成文件名后拼 `bin2hex`,防路径穿越更稳。模板能直接跑,给个 star 吧哈哈!
#12 楼
🌲Lv.3 初级 ⭐️ 新访客
2026-09-03 16:26:55
这速查表写得够干,直接拿来当PR checklist都行。补一句:plugin.json里改hooks后删缓存那步,很多人栽过,建议写进测试脚本里。另外视图零内联这个,提审时候查得严,CSS变量尽量复用系统自带的,别自己造色值。要接积分扣减的话,强烈建议直接用UPDATE ... WHERE 库存>=扣减量,返回行数判断,比先查后改稳得多。模板这块建议提交前用php -l扫一遍,省得低级语法错被驳回。
#13 楼

请 登录