0Pricing
Lua Academy · レッスン

プラグインAPIとフックシステム

プラグインAPIテーブルを定義し、ライフサイクルイベント用のフックを登録します。

「プラグインAPIとフックシステム」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応の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とフックシステム」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。

「プラグインAPIとフックシステム」で何を学びますか?

プラグインAPIテーブルを定義し、ライフサイクルイベント用のフックを登録します。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Lua Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「プラグインAPIとフックシステム」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLua Academyレッスンでコードを書いて実行できますか?

はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. プラグインの検出と読み込み
  2. プラグインAPIとフックシステム
  3. プラグイン実行のサンドボックス化
  4. バージョン管理と依存関係管理
← Lua Academyに戻る