ブックマークアプリケーションの実行
それでは、次のコマンドを実行し、作成したブックマークアプリケーションを実行させてみましょう。
$ cd ./Bookmark $ ./script/bookmark_server.pl
正常に実行したら、次のURLをWebブラウザで表示させてください。
http://<ホスト名またはIPアドレス><:Port>/
まず最初はエントリが0件なのでブックマーク情報は何も表示されていません。この画面にある[ブックマークの追加]リンクをクリックすると、ブックマークを追加するページに移動します。
この例では、CodeZineのサイトをブックマークに追加しています。必要なURLとタイトルを入力し、[登録]ボタンを押下すると、index画面にリダイレクトします。
先ほど追加したブックマークが一覧に表示されていることを確認できると思います。ここで[編集]リンクをクリックすると、指定したエントリIDの内容を編集する画面に移動します。
先ほど追加したデータに加えて、コメント情報も追加してみましょう。[更新]ボタンをクリックすると値の変更が行われ、index画面に移動します。
[削除]リンクをクリックすると、削除の確認画面が表示されます。ここで[削除]ボタンをクリックすると、実際にデータが削除されます。
モデルをアプリケーションから切り離す
最近のCatalystアプリケーションのファイルレイアウトとして、ロジックを記述するモデルをCatalystに依存しないモジュールとして切り離すことが推奨されています。例えばモダンPerl入門では次のような構成が紹介されています。
| 名前空間 | 説明 |
| MyApp::Web | Webアプリケーション本体 |
| MyApp::CLI | CLI(コマンドラインインターフェイス)ツール類 |
| MyApp::API | アプリケーションロジック |
| MyApp::Catalyst | 本アプリケーション用Catalyst拡張 |
MyApp::APIにデータベースアクセスを含むロジックを実装した場合、CatalystからはこのAPI以下のモジュールをモデルとして扱えるようにする必要があります。
この処理をサポートするためのモジュールとして、Catalyst::Model::Adaptorなどが公開されています。
最後に、Bookmark::API::Entryモジュールにブックマークの一覧を取得するメソッドを実装し、これをCatalystからとCLIツールから呼び出す例を紹介します。
まずCatalyst::Model::Adaptorをインストールします。rootユーザーで次のコマンドを実行します。
# perl -MCPAN -e 'install Catalyst::Model::Adaptor'
最初にBookmark::API::Entry(Bookmark/lib/Bookmark/API/Entry.pm)を作成します。
package Bookmark::API::Entry;
use strict;
use warnings;
sub new {
return bless {}, shift;
}
sub all {
my ($self, $rs) = @_;
return $rs->all();
}
1;
allメソッドでは、パラメータとして渡されたDBIx::Class::ResultSetのallメソッドを呼び出しています。実際のロジックではデータベース操作+αの処理を実装することになると思います。
次にこのクラスをモデルとして使用できるようにするために、Catalyst::Model::Adaptorを使用してモデルを登録します。これもヘルパスクリプトを使用します。
このヘルパスクリプトに渡す最低限必要なパラメータは次のようになります。
$ <MyApp>_create.pl model モデル名 Adaptor モデルとして使用するクラス名
それでは、Bookmark::API::Entryに対応したモデルを作成してみましょう。モデルクラス名をBookmarkEntryとして、次のコマンドで作成します。
$ ./Bookmark/script/bookmark_create.pl model BookmarkEntry Adaptor Bookmark::API::Entry
BookmarkEntryを使用したlistアクションをRoot.pmに追加します。実装は次のようになります。
sub list :Local :Args(0) {
my ( $self, $c ) = @_;
my $api = $c->model('BookmarkEntry');
$c->stash->{entries} = [$api->all($c->model('BookmarkDB::Entry'))];
$c->stash->{template} = 'index.tt';
}
最後に、登録されているブックマークエントリの一覧を表示するCLIスクリプトは次のようになります。
#!/usr/bin/env perl
use strict;
use warnings;
use Path::Class::File;
# Bookmark/lib以下を@INCに含める
BEGIN {
my $lib = Path::Class::File->new(__FILE__)->parent->parent->subdir('lib');
unshift @INC, $lib->absolute->stringify;
}
use Bookmark::API::Entry;
use Bookmark::Schema;
# データベースと接続
my $schema = Bookmark::Schema->connection('dbi:SQLite:./db/bookmark.db');
# Bookmark::API::Entryの作成
my $api = Bookmark::API::Entry->new();
# Schemaを渡して一覧取得
my @entries = $api->all($schema->resultset('Entry'));
foreach my $e ( @entries ){
# 1エントリずつ表示
my @array = ($e->id, $e->url, $e->title, $e->comment, $e->counter);
my $str = join(' | ', @array);
print "$str\n";
}
Catalystに依存しないクラスを使って、ブックマークエントリの一覧を表示できることを確認してください。
まとめ
本記事では、サンプルを交えつつCatalystのモデルプログラミングについて紹介しました。今回作成したサンプルでは、データベースへの保存ができるようになったことから、アプリケーションとしての体裁がやっと整ってきたと感じています。
次回は、MVCの最後、Catalystのビュープログラミングについて、サンプルを交えつつ説明していく予定です。
参考資料
- 『Catalyst-Manual-5.8003』
- 『モダンPerl入門』 牧大輔 著、翔泳社、2009年2月





