ダウンロード サンプルファイル (19.3 KB)
ブックマークアプリケーションの実行
それでは、次のコマンドを実行し、作成したブックマークアプリケーションを実行させてみましょう。
$ 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月
この記事は参考になりましたか?
既に会員の方はを行ってください。
- Webアプリケーションフレームワーク「Catalyst」入門連載記事一覧
- この記事の著者
-
山田 祥寛(ヤマダ ヨシヒロ)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
-
WINGSプロジェクト 花田 善仁(ハナダ ヨシヒト)
<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書、記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア





