PerlのWAFでAmon2っていうのがあるんだけど、最近のアップデートでO/RマッパーにTengを使うようになって、チュートリアルが動かなくなってて挫折しかけたのでメモ
目次
旧チュートリアルに沿って進めます
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 を見てみましょう
わぁい