Perl: Amon2 で DB を利用したウェブアプリ 2014 春

セットアップ

とりあえず Large フレーバー

$ amon2-setup.pl HelloWorld --flavor Large
$ cd HelloWorld
$ carton install
$ sqlite3 db/development.db < sql/sqlite.sql

デフォルトで sql/sqlite.sql と lib/HelloWorld/DB/Schema.pm で member テーブル (id, name) を持つ DB と O/R マッパーができるので、これにデータを足していくアプリにしてみる。

Perl: lib/HelloWorld/Web/C/Root.pm

package HelloWorld::Web::C::Root;
use strict;
use warnings;
use utf8;

sub index {
    my ($class, $c) = @_;
    
    my $counter = $c->session->get('counter') || 0;
    $counter++;
    $c->session->set('counter' => $counter);
    my @members = $c->db->search_by_sql(q{
        SELECT * FROM member ORDER BY id DESC LIMIT 10
    });
    return $c->render('index.tx', {
        counter => $counter,
        members => \@members,
    });
}

sub post {
    my ($class, $c) = @_;
    
    if ( my $body = $c->req->param('body') ) {
        $c->db->insert(
            'member',
            +{
                name => $body,
            }
        );
    }
    return $c->redirect('/');
}

sub reset_counter {
    my ($class, $c) = @_;

    $c->session->remove('counter');
    return $c->redirect('/');
}

1;

Perl: lib/HelloWorld/Web/Dispatcher.pm

post '/post' => 'Root#post';

一行追加

Kolon: tmpl/web/index.tx

上の方に追加 Amon2 のテンプレートデフォルト文法いつの間にか TTerse から Kolon になってたので Kolon で記述

<form method="post" action="<: uri_for('/post') :>">
  <input type="text" name="body" />
  <input type="submit" value="Send" />
</form>
 
<table>
: for $members -> $member {
  <tr>
    <td><: $member.id :></td>
    <td><: $member.name :></td>
  </tr>
: }
</table>

起動

$ carton exec perl -Ilib script/helloworld-web-server

http://127.0.0.1:5000 をブラウザで開くとフォームが出来ていて、Send したらデータが追加されていけば完成。