Routerライブラリを書き直すことに決めた
前回の日記で「RouterやDispatcherもプラガブルにしたい」「Rackのような抽象化をRouterレベルでトライしてみたい」と書きましたが、これ、ちょっとおかしいですね。
HTTPD <-> Rack <-> アプリケーション アプリケーション <-> ???? <-> Router
抽象化であることは確かですが、アプリケーションからみれば向きが逆なわけです。Router間の差異を吸収したければ、ひとつひとつAdapterを書けば済みます。
結局、下記のように進めることにしました。
- 自分好みのRouterライブラリを探す。インターフェースに癖があるならAdapterも書く
- 見つからなければ、自分で書く
そのためには「自分好みのRouterライブラリ」が何であるか、はっきりさせねばなりません。要件をまとめると、下記のようになりました。
- Rackや特定フレームワークに依存していない
- URI Templateでルーティング定義できる
- actionの指定がoptionalである(URIからアクションが決まるのはおかしい)
- ルート名とパラメータからURIが生成できる
Github上にはこの要件を満たすRouterライブラリは見当たりませんでした。私の作ったRuptaもそうで、4を満たしていません。やはり、書き直したほうがよさそうです。
Ruptaはそもそもインターフェースがこなれておらず、他のRouterライブラリのようなルーティング設定の追加メソッドがありません。プラガブルであることを目指すならば、多数派に合わせておくのが無難でしょう。メソッド名は未定ですが、PHPのPEAR::Net_URL_Mapperのように、connect()/match()/generate()の3メソッドに分けようと考えています(参考)。