tokuhirom's Blog

Amon::Web::Dispatcher::Lite をかいたこと

Router-Simple をつくったり MojaMoja をかいたりしていたのだが、Amon でかいたちょっとしたアプリで、コントローラクラスが数個にしかならないような規模の場合に、いちいち MyApp::C::* を開いて書くのが面倒なので、Amon::Web::Dispatcher::Lite というのをかいて、これを利用できるようにした。

以下は nopaste っぽいサイトの例だが、てっとりばやくかけてよい。
http://github.com/tokuhirom/p5-OreOre-NoPaste

package OreOre::NoPaste::Web::Dispatcher;
use Amon::Web::Dispatcher::Lite -base;
use Data::UUID;
use Encode;

my $uuid_gen = Data::UUID->new;

get '/' => sub {
    render("index.mt");
};

post '/post' => sub {
    my $body = param_decoded("body")
        or return redirect('/');

    my $uuid = $uuid_gen->create_str();
    my $sth = db->insert(
        entry => {
            id => $uuid,
            body => $body,
        }
    );
    return redirect("/entry/$uuid");
};

get '/entry/{entry_id}' => sub {
    my ($c, $args) = @_;
    my $entry_id = $args->{entry_id}
        or return res_404();

    my $entry = db->single(
        entry => {
            id => $entry_id,
        }
    );
    return res_404() unless $entry;

    return render('show.mt', $entry->body);
};

1;