Amon2のDispatcher::RouterSimple、個人的にこんなのだといいなー、という例
[追記]
tokuhirom氏に「よさげ」って言ってもらえたので、調子にのってgithubに上げました(シーパン王サーじゃないので)。Amon2::Web::Dispatcher::RouterSimple::Extendedって名前にしております。::RailsLikeとかも考えたけど、関数名違うから混乱するのでやめ。そして自分の英語がひどすぎて死ぬ。あとモジュール名長すぎる。
https://github.com/taiyoh/p5-Amon2-Web-Dispatcher-RouterSimple-Extended
[追記終わり]
[追記2]
gfx氏から「no strict 'refs';状態でガリガリ書くのはマズイ」という指摘を受けて、確かにそうだよなー、でも、submapperへの出入りでコロコロ切り替わるから、限定するのはムズいよなー、と思ったので、関数はある程度他所で定義するようにして、あとは力技でuse strict 'refs'をこまめに入れて厳密性を高めるようにしてみた。ちょっと僕の技量だとこれが限界なので、もっといい実装あればアドバイス or pull-reqください。。。><
https://github.com/taiyoh/p5-Amon2-Web-Dispatcher-RouterSimple-Extended/commit/8fd8e02cfb31bfb852644f163aeae24f251a85c9
[追記2終わり]
久々にPerl書いております。
Amon2でやってみようかと思って色々読んでいるのですが、Router周りはRails的な方が個人的には好みだなー、と思ったので、こんな風に変えてみた。一応テストも書いて通している。
こうすると、
package MyApp::Web::Dispatcher; use strict; use warnings; use utf8; use Amon2::Web::Dispatcher::RouterSimple; connect '/' => 'Root#index'; # API submapper '/api/' => API => sub { get 'foo' => 'foo'; post 'bar' => 'bar'; }; # user submapper '/user/' => User => sub { get '', 'index'; connect '{uid}', 'show'; post '{uid}/hoge', 'hoge'; connect 'new', 'create'; }; 1;
という感じで、色々関数を使えるようになる。最初はsubmapperの扱いがぞんざいだと思ったので、再定義して第三引数に定義した関数内もconnectを使えるようにしただけだったんだけど、欲が出たのでget/post/put/deleteも使えるようにしてしまった。
あとホントはantipop氏が1年前くらいのブログ記事で書いている通り、
ディスパッチされるコントローラのクラスが、::C::*というような名前で、僕はクラス名などを省略するのが個人的に嫌い
ぼくがかんがえたさいきょうのAmon2のつかいかた - delirious thoughts
というのに僕も賛成なのですが、まあ、もういいや、と。自分でRouterを再定義してそっちを使うようにすればいいので。
ともあれ、Amon2はわかりやすく、かつ、カスタマイザブルなWAFなので、とても使い易いものだと思います。これでちょっといろいろ試してみたいところです。
ぼくがかんがえたさいきょうのAmon2のつかいかた - delirious thoughts
ということなので、Amon2のコア部分とうまく付き合いながら、オレオレになりすぎないようにやっていこうと思っております。