月 の 上

Amon2 4.01でチュートリアル

PerlのWAFでAmon2っていうのがあるんだけど、最近のアップデートでO/RマッパーにTengを使うようになって、チュートリアルが動かなくなってて挫折しかけたのでメモ

目次

  • amon2-setup.pl 実行
  • sql/sqlite.sql 変更
  • DB/Schema 変更
  • Dispatcher 変更
  • index.tt 変更

旧チュートリアルに沿って進めます

amon2-setup.pl

amon2-setup.pl BBS

これをやると、Amon2アプリのひな形が生成されます
ひな形を改変して自分のアプリを作っていきます

sql/sqlite.sql 変更

DBのスキーマ(表の構造)を設定します
sql/sqlite.sql を以下のように変更します

CREATE TABLE IF NOT EXISTS sessions (
    id           CHAR(72) PRIMARY KEY,
    session_data TEXT
);

CREATE TABLE IF NOT EXISTS entry (
    entry_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    body varchar(255) not null
);

entryのIDが自動で付くように AUTOINCREMENT を指定します

スキーマを変更したら、忘れずにDBに反映させます

sqlite3 db/development < sql/sqlite.sql

DB/Schema 変更

lib/BBS/DB/Schema.pm を変更します
スキーマがどうなってるのかTengに教えてあげます

package BBS::DB::Schema;
use strict;
use warnings;
use utf8;

use Teng::Schema::Declare;

base_row_class 'BBS::DB::Row';

table {
    name 'sessions';
    pk 'id';
    columns qw(session_data);
};

table {
    name 'entry';
    pk 'entry_id';
    columns qw(body);
};

1;

Dispatcher 変更

lib/BBS/Web/Dispatcher.pm を変更します

package BBS::Web::Dispatcher;
use strict;
use warnings;
use utf8;
use Amon2::Web::Dispatcher::Lite;

any '/' => sub {
    my ($c) = @_;

    my @entries = $c->db->search_by_sql(q{
        SELECT * FROM entry
          ORDER BY entry_id DESC LIMIT 10
    });

    return $c->render( 'index.tt' => { entries => \@entries } );
};

post '/post' => sub {
    my ($c) = @_;

    if ( my $body = $c->req->param('body') ) {
        $c->db->insert(
            'entry',
            +{
                body => $body,
            }
        );
    }

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

1;

旧チュートリアルといろいろ異なります
entriesを取得してるところ、my $entries = ... ってやると駄目なので注意
(データの配列リファレンスではなく、イテレータが返ってくる)

index.tt 変更

tmpl/index.tt を変更します (これは旧チュートリアルのまんまでおk)

[% WRAPPER 'include/layout.tt' %]

<form method="post" action="[% uri_for('/post') %]">
  <input type="text" name="body" />
  <input type="submit" value="Send" />
</form>

<ul>
  [% FOR entry IN entries %]
  <li>[% entry.entry_id %]. [% entry.body %]</li>
  [% END %]
</ul>

[% END %]

完成

plackup app.psgi

して、http://localhost:5000 を見てみましょう

f:id:amagitakayosi:20130912142730p:plain

わぁい