前回はArkを使用した開発方法と開発の一連の流れを説明しました。今回から2回に分けてより実用的なサンプルアプリケーションを作成しながら、
掲示板の概要
今回作成するアプリケーションは、
モデルとビュー
前回はコントローラだけしか使用しませんでした。今回はモデルとビューもすべて使用します。
Arkは、

モデル
モデルはアプリケーションのロジックを定義するクラスです。
上記の例ではデータベースやキャッシュ周りのモジュールをモデルとして使用するという例を挙げましたが、
この方法は、
最近ではCatalystでもこの方法を推奨するようになってきていて、
このモデルの方法をサポートするために、
このクラスを使用すると、
package MyApp::Model::Cache
use Ark 'Model::Adaptor';
__PACKAGE__->config(
class => 'Cache::Memcached',
args => { servers => ['127.0.0.1:11211'] },
);
1;
このコードは Cache::Memcached をモデルとして使用する例です。こうするとコントローラから
$c->model('Cache')
でCache::Memcachedオブジェクトにアクセスできます。
この機能を使用し、
ビュー
ビューはWebアプリケーションの最終出力部分を司るクラスです。テンプレートエンジンを使用して出力するHTMLを作成したり、
こちらもモデルと同じようにアダプターを使用して外部モジュールに丸投げする、
現在のバージョンでは、
プラグイン
プラグインはセッション機能、
今回はログイン処理のために
- セッションプラグイン
- 認証プラグイン
を使用します。
アプリケーションの作成
それではアプリケーションを作っていきましょう。今回作るアプリケーションのソースコード全体はgithubに上げてありますので、
依存モジュール
今回作成するアプリケーションは、
- DBIx::Class::Schema::Loader
(DB接続に使用) - DBD::SQLite
(SQLiteデータベース) - Net::OpenID::Consumer
(OpenID認証に使用) - LWPx::ParanoidAgent
(OpenID認証に使用) - DateTime
(日付データに使用)
作業を進める前にこれらのモジュールをインストールしてください。
モデルの作成
まずアプリケーションのロジックを作ります。クラス名はMiniBBS::Service::BBSとします。
最初にこのロジックのインタフェースを考えましょう。こういう感じで使いたいというのをイメージしつつ、
# 初期化
my $bbs = MiniBBS::Service::BBS->new( connect_info => [DB接続情報] );
# BBSにメッセージを投稿
my $new_message = $bbs->add_message({
user => 'ユーザー名',
body => '投稿メッセージ',
});
# BBSメッセージを一覧
my $messages = $bbs->messages;
こんな感じで使えたらいいのではないでしょうか。次にこれを実装していきますが、
t/
このようにモデルを外部モジュールとして単体で使用できる物にすることで、
この実装をModel::Adaptorを使用してArkのモデルとします。モデルのひな形も前回同様に ark.
$ ark.pl model BBS Model::Adaptor
Creating directory .
Creating lib/MiniBBS/Model/BBS.pm
このコマンドでlib/
package MiniBBS::Model::BBS;
use Ark 'Model::Adaptor';
1;
ここに接続するクラスの情報を加えるとこのようになります。
package MiniBBS::Model::BBS;
use Ark 'Model::Adaptor';
__PACKAGE__->config(
class => 'MiniBBS::Service::BBS',
args => { connect_info => ['dbi:SQLite:' . MiniBBS->path_to('minibbs.db') ] },
deref => 1,
);
1;
この設定ではDBへの接続にMiniBBS->path_
では、
$ sqlite3 minibbs.db < minibbs.sqlite.sql
これでminibbs.
テンプレートを使用
モデルが定義できたので、
$ ark.pl view MT View::MT
このコマンドは、
このテンプレートビューの使い方は、
$c->view('MT')->template('template_name');
$c->forward( $c->view('MT') );
とビュークラスにforwardする方法と、
my $body = $c->view('MT')->render('template_name');
$c->res->body( $body );
テンプレートをレンダリングした結果を自分でレスポンスに入れる方法があります。今回は前者の方法を使用します。
Rootアクションに以下のコードを加えます。
sub end :Private {
my ($self, $c) = @_;
unless ($c->res->body or $c->res->status =~ /^3\d\d/) {
$c->forward( $c->view('MT') );
}
}
endアクションはコントローラディスパッチのあとに呼ばれる特別なアクションです。
ここではコントローラがbodyを埋めていなかったらテンプレートに処理を渡す、
この後、