スケルトンに掲示板機能を付けてみる
スケルトンを眺めているだけではおもしろくないので、
掲示板のスキーマ
今回、
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,
body varchar(255) not null
);
sessionsテーブルはセッションの保存用テーブルです。
コントローラの実装
コントローラも実装してしまいましょう。実装はリスト3のようになります。シンプルなコードになっています。$c->dbh
でデータベースハンドルを取り出して操作を行っています。$c->req()
は、
package MyApp::Web::Dispatcher;
use strict;
use warnings;
use Amon2::Web::Dispatcher::Lite;
any '/' => sub {
my ($c) = @_;
my @entries = @{$c->dbh->selectall_arrayref(
q{SELECT * FROM entry ORDER BY entry_id DESC LIMIT 10},
{Slice => {}}
)};
return $c->render(
"index.tt" => {
entries => \@entries,
}
);
};
post '/post' => sub {
my ($c) = @_;
if (my $body = $c->req->param('body')) {
$c->dbh->insert(entry => +{
body => $body,
});
}
return $c->redirect('/');
};
1;
テンプレートの変更
最後の仕上げに、
[% 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 %]
柔軟なトリガ
Amon2ではSledge由来の柔軟なトリガ機構を提供しています。現在のバージョンは表1に挙げたものをサポートしています。Amon2自体を変更しなくても容易に拡張ができますし、
名称 | 概要 |
---|---|
BEFORE_ | コントローラの動作前 |
AFTER_ | コントローラの動作後 |
HTML_ | HTMLへのフィルタ処理 |
トリガにコードを追加するにはMyApp::Webの中で次のように書きます。
__PACKAGE__->add_trigger(BEFORE_DISPATCH => sub {
my $c = shift;
...
});
HTML_
__PACKAGE__->add_trigger(HTML_FILTER => sub {
my ($c, $html) = @_;
$html =~ s/ さいきろん/ さいくろん/g;
return $html;
});
AFTER_
__PACKAGE__->add_trigger(AFTER_DISPATCH => sub {
my ($c, $response) = @_;
...
});
また、
sub index {
my $c = shift;
$c->add_trigger(AFTER_DISPATCH => sub { ... });
...
}
まとめ
今回は、
さて、