岩本隆史の日記帳(アーカイブ)

はてなダイアリーのサービス終了をうけて移行したものです。更新はしません。

Routerライブラリを書き直すことに決めた

前回の日記で「RouterやDispatcherもプラガブルにしたい」「Rackのような抽象化をRouterレベルでトライしてみたい」と書きましたが、これ、ちょっとおかしいですね。

HTTPD              <->   Rack   <->   アプリケーション
アプリケーション   <->   ????   <->   Router

抽象化であることは確かですが、アプリケーションからみれば向きが逆なわけです。Router間の差異を吸収したければ、ひとつひとつAdapterを書けば済みます。

結局、下記のように進めることにしました。

  1. 自分好みのRouterライブラリを探す。インターフェースに癖があるならAdapterも書く
  2. 見つからなければ、自分で書く

そのためには「自分好みのRouterライブラリ」が何であるか、はっきりさせねばなりません。要件をまとめると、下記のようになりました。

  1. Rackや特定フレームワークに依存していない
  2. URI Templateでルーティング定義できる
  3. actionの指定がoptionalである(URIからアクションが決まるのはおかしい)
  4. ルート名とパラメータからURIが生成できる

Github上にはこの要件を満たすRouterライブラリは見当たりませんでした。私の作ったRuptaもそうで、4を満たしていません。やはり、書き直したほうがよさそうです。

Ruptaはそもそもインターフェースがこなれておらず、他のRouterライブラリのようなルーティング設定の追加メソッドがありません。プラガブルであることを目指すならば、多数派に合わせておくのが無難でしょう。メソッド名は未定ですが、PHPPEAR::Net_URL_Mapperのように、connect()/match()/generate()の3メソッドに分けようと考えています(参考)。