Clack

Revenge of Lisp in Web

Chapter 7: ミドルウェア

English | 日本語

この章では、「ミドルウェア」という機構について説明します。ミドルウェアは、Clackがシンプルさを失わずにいかに強力で拡張性があるかを知る上で、最も重要なコンセプトになっています。

ミドルウェアとは

これまでの話では、アプリケーションはリクエストを受け取って、ただレスポンスを返すだけでした。

この図にミドルウェアを追加したものが以下です。

アプリケーションの回りを包み込んでいるのがミドルウェアです。ミドルウェアはアプリケーションより先にリクエストをもらい、アプリケーションが返したレスポンスを受け取って返します。つまり、アプリケーションをラップすることで、ミドルウェアは既存のコードに手を加えずに、アプリケーションの挙動を変更することができます。

これはとても可能性に満ちた機構です。

Clack.Middleware

Clackでミドルウェアを書くのは、既にコンポーネントを知っていれば難しくありません。

;; 分かりやすさのためにシンボルをimportしておきます
(import '(clack:<middleware>
          clack:call
          clack:call-next))

(defclass <sample-mw> (<middleware>) ())

(defmethod call ((this <sample-mw>) env)
  ;; 前処理
  (let ((response (call-next this env)))
    ;; 後処理
    ))

Clackミドルウェアは<middleware>のサブクラスで、メソッドcallを持ちます。<component>とよく似た構造です。

call-nextという関数に気づきましたか? これは「次の」コンポーネント (ミドルウェアやアプリケーション) の呼び出しです。この章の2番目の図を思い出してください。ミドルウェアは他のコンポーネントを包むものです。call-nextを呼ぶことで、ミドルウェアはラップしたコンポーネントを呼び出すことができます。

ミドルウェアの美しさは、これがWebアプリケーションの間で再利用可能であることです。次の章では、このミドルウェアの実例を紹介します。