插件 API 和钩子系统
定义插件 API 表,并为生命周期事件注册钩子。
插件 API 和钩子系统 是 CoddyKit 上的免费 Lua Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Lua Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Lua Academy 课程共包含 4 节课。
钩子系统是什么?
钩子系统允许插件为特定的应用程序生命周期事件注册回调。应用程序会在适当的时间调用所有已注册的钩子。
应用程序对象
应用程序对象会在初始化期间传递给插件。它公开了钩子注册 API。
local App = {}
App.__index = App
App._hooks = {}
function App:on(event, fn)
self._hooks[event] = self._hooks[event] or {}
table.insert(self._hooks[event], fn)
end
function App:emit(event, ...)
for _, fn in ipairs(self._hooks[event] or {}) do
fn(...)
end
end插件注册钩子
插件的 init 函数接收应用程序对象并注册钩子。
-- plugins/auth.lua
return {
name = "auth",
init = function(app)
app:on("request", function(req)
if not req.headers.token then
error("Unauthorized")
end
end)
end
}钩子优先级
允许插件指定优先级,以便关键钩子(例如身份验证)先于可选钩子(例如日志记录)运行。
function App:on(event, fn, priority)
priority = priority or 50
local hooks = self._hooks[event] or {}
hooks[#hooks+1] = {fn=fn, priority=priority}
table.sort(hooks, function(a,b) return a.priority < b.priority end)
self._hooks[event] = hooks
end钩子的返回值
某些钩子会返回可以改变行为的值。应用程序可以在首次出现非 nil 返回值时提前终止后续处理。
function App:filter(event, data)
for _, fn in ipairs(self._hooks[event] or {}) do
local result = fn(data)
if result ~= nil then return result end
end
return data
end注销钩子
提供 :off(event, fn) 方法,以便通过函数引用移除特定钩子。
钩子命名空间
使用以点分隔的事件名称进行组织:"request.before"、"request.after"、"db.query"。
插件提供的命令
除了钩子之外,插件还可以注册由应用程序或其他插件调用的命名命令。
function App:registerCommand(name, fn)
self._commands = self._commands or {}
self._commands[name] = fn
end
function App:run(name, ...)
local cmd = self._commands[name]
if cmd then return cmd(...) end
error("Unknown command: " .. name)
end中间件模式
钩子链可以形成中间件栈,其中每个钩子都会调用下一个钩子,从而支持请求/响应转换流水线。
隔离测试插件
在测试中创建模拟应用程序对象,以验证插件钩子是否已正确注册并调用。
文档约定
记录所有可用的钩子名称、参数及预期返回值。这构成了第三方开发者所依赖的插件约定。
钩子系统问题
优先级在钩子系统中的作用是什么?
回顾:插件 API 与钩子系统
在应用程序对象上公开 :on(event, fn) 注册 API。使用 :emit() 发出事件。添加优先级以控制执行顺序。使用带命名空间的事件名称,并为插件开发者记录钩子约定。
常见问题解答
「插件 API 和钩子系统」课时是免费的吗?
是的 — 「插件 API 和钩子系统」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Lua Academy 课程的其余内容,请升级到 CoddyKit PRO。 Lua Academy 课程共包含 4 节课。
「插件 API 和钩子系统」这节课中我会学到什么?
定义插件 API 表,并为生命周期事件注册钩子。 你通过在浏览器中直接运行的动手代码来练习 Lua Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Lua Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Lua Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「插件 API 和钩子系统」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Lua Academy 课中编写并运行代码吗?
能。每节 Lua Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。