Perl-users.jp

ディスパッチャの比較検討

ディスパッチャは、ウェブアプリケーションフレームワークの重要な一部品であるが、意外と語られることが少ないものだ。

フレームワーク非依存

HTTPx::Dispatcher

package Your::Dispatcher;
use HTTPx::Dispatcher;
connect ':controller/:action/:id';
1;

高速。安定している。稼動実績がある。mobirc などのいくつかのオープンソースソフトウェアで採用実績がある。 同種のものの中では最もシンプルで、かつ最初に実装/リリースされた。

Python の Routes を三項にしている。

Path::Routes

my $router = Path::Router->new;

$router->add_route('blog' => (
    defaults => {
        controller => 'blog',
        action     => 'index',
    }, 
    # you can provide a fixed "target" 
    # for a match as well, this can be
    # anything you want it to be ...
    target => My::App->get_controller('blog')->get_action('index')
));

汎用性があるもののなかではもっとも高機能だとおもう。一方で速度はそれほどでないかも(と、stevan がいってた)

Rails のルーターをインスパイヤしているらしい。

Path::Dispatcher

use Path::Dispatcher;
my $dispatcher = Path::Dispatcher->new;

$dispatcher->add_rule(
    Path::Dispatcher::Rule::Regex->new(
        regex => qr{^/(foo)/},
        block => sub { warn $1; }, # foo
    )
);

$dispatcher->add_rule(
    Path::Dispatcher::Rule::Tokens->new(
        tokens    => ['ticket', 'delete', qr/^\d+$/],
        delimiter => '/',
        block     => sub { delete_ticket($3) },
    )
);

my $dispatch = $dispatcher->dispatch("/foo/bar");
die "404" unless $dispatch->has_matches;
$dispatch->run;

Path::Router とほぼ同じものに見える。なにが違うのかボクにはわからないんだ。

フレームワークにひもづいているもの

CGI::Application::URIMapping

id:kazuhooku 謹製のディスパッチャ。たぶん pathtraq などで稼動実績がある(という噂)

Catalyst::DispatchType::Chained

sub foo_setup : Chained('/') PathPart('foo') CaptureArgs(1) {
    my ( $self, $c, $foo_arg ) = @_;
    ...
}

Controller の側にアトリビュートで指定してやる。


目次へ

Last modified: $Date: 2008-10-26T05:38:56.231052Z $