taiyoh's memorandum

@ttaiyoh が、技術ネタで気づいたことを書き溜めておきます。

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のコア部分とうまく付き合いながら、オレオレになりすぎないようにやっていこうと思っております。