(1)はこちら、(2)はこちらから。
スケルトンに掲示板機能を付けてみる
スケルトンを眺めているだけではおもしろくないので、スケルトンをベースに実際に掲示板機能を付けてみましょう。
掲示板のスキーマ
今回、セットアップが簡単なようにデータベースにはSQLite3を用います。sql/sqlite3.sqlに次のように書きましょう。
sessionsテーブルはセッションの保存用テーブルです。
コントローラの実装
コントローラも実装してしまいましょう。実装はリスト3のようになります。シンプルなコードになっています。$c->dbh
でデータベースハンドルを取り出して操作を行っています。$c->req()
は、Amon2::Web::Requestのインスタンスを取り出すアクセサメソッドです。Amon2::Web::RequestはPlack::Requestのラッパですが、paramメソッドをラップしていて、自動的に文字コードのデコーディング処理が実行されていることに注意してください。
テンプレートの変更
最後の仕上げに、テンプレートを変更しましょう。変更すべきテンプレートはtmpl/index.ttというファイルです。これをリスト4のように変更します。Amon2ではデフォルトでText::Xslateをテンプレートエンジンとして採用しており、TTerseというシンタックスを用いています。これはTemplate-Toolkitに近い文法なので、シンプルで見やすいです。
柔軟なトリガ
Amon2ではSledge由来の柔軟なトリガ機構を提供しています。現在のバージョンは表1に挙げたものをサポートしています。Amon2自体を変更しなくても容易に拡張ができますし、これらのトリガを利用したプラグインの開発も容易となっています。
表1 Amon2のトリガ
名称 | 概要 |
BEFORE_DISPATCH | コントローラの動作前 |
AFTER_DISPATCH | コントローラの動作後 |
HTML_FILTER | HTMLへのフィルタ処理 |
トリガにコードを追加するにはMyApp::Webの中で次のように書きます。
HTML_FILTERは、HTMLに対するフィルタ処理を実現します。AFTER_DISPATCHと分かれているのはUTF-8フラグの処理のためです。HTML_FILTERのタイミングではまだUTF-8フラグが立っているので文字列として扱うことができますが、AFTER_DISPATCHの時点ではエンコード済みのバイト列がわたってくるので、文字列の置換などができません。
AFTER_DISPATCHの場合にはResponseオブジェクトが渡ってきますから、このオブジェクトを操作できます。
また、トリガはクラスに対して書けるだけでなくコンテキストオブジェクトのインスタンスに対しても書けます。この場合は現在のコンテキストが終了するまでの間だけ有効となります。
まとめ
今回は、Amon2というWebアプリケーションフレームワークについて簡単に解説しました。非常に安定しているので使いやすいと思います。ぜひお試しください。
さて、次回の執筆者はまかまか般若波羅蜜さんで、テーマは「Acmeモジュールで広がるPerlの世界」です。