0Pricing
Lua Academy · 课时

插件 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 发现和加载插件
  2. 插件 API 和钩子系统
  3. 沙箱化插件执行
  4. 版本管理和依赖管理
← 返回 Lua Academy