SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Webアプリケーションフレームワーク「Catalyst」入門

初めてのCatalyst入門(7)
モデルを使ったプログラミング

ブックマークの情報をデータベースに保存する


ブックマークアプリケーションの実行

 それでは、次のコマンドを実行し、作成したブックマークアプリケーションを実行させてみましょう。

[リスト11]Bookmarkアプリケーションの起動
$ cd ./Bookmark
$ ./script/bookmark_server.pl

正常に実行したら、次のURLをWebブラウザで表示させてください。

http://<ホスト名またはIPアドレス><:Port>/
初期一覧表示画面
初期一覧表示画面

 まず最初はエントリが0件なのでブックマーク情報は何も表示されていません。この画面にある[ブックマークの追加]リンクをクリックすると、ブックマークを追加するページに移動します。

ブックマークの追加画面
ブックマークの追加画面

 この例では、CodeZineのサイトをブックマークに追加しています。必要なURLとタイトルを入力し、[登録]ボタンを押下すると、index画面にリダイレクトします。

ブックマーク追加後の一覧表示画面
ブックマーク追加後の一覧表示画面

 先ほど追加したブックマークが一覧に表示されていることを確認できると思います。ここで[編集]リンクをクリックすると、指定したエントリIDの内容を編集する画面に移動します。

ブックマークの編集画面
ブックマークの編集画面

 先ほど追加したデータに加えて、コメント情報も追加してみましょう。[更新]ボタンをクリックすると値の変更が行われ、index画面に移動します。

ブックマークの削除画面
ブックマークの削除画面

 [削除]リンクをクリックすると、削除の確認画面が表示されます。ここで[削除]ボタンをクリックすると、実際にデータが削除されます。

モデルをアプリケーションから切り離す

 最近のCatalystアプリケーションのファイルレイアウトとして、ロジックを記述するモデルをCatalystに依存しないモジュールとして切り離すことが推奨されています。例えばモダンPerl入門では次のような構成が紹介されています。

モダン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ユーザーで次のコマンドを実行します。

[リスト11]Catalyst::Model::Adaptorモジュールのインストール
# perl -MCPAN -e 'install Catalyst::Model::Adaptor'

 最初にBookmark::API::EntryBookmark/lib/Bookmark/API/Entry.pm)を作成します。

[リスト12]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::ResultSetallメソッドを呼び出しています。実際のロジックではデータベース操作+αの処理を実装することになると思います。

 次にこのクラスをモデルとして使用できるようにするために、Catalyst::Model::Adaptorを使用してモデルを登録します。これもヘルパスクリプトを使用します。

 このヘルパスクリプトに渡す最低限必要なパラメータは次のようになります。

[リスト13]Catalyst::Model::Adaptorを使用してモデルを作成するパラメータ
$ <MyApp>_create.pl model モデル名 Adaptor モデルとして使用するクラス名

 それでは、Bookmark::API::Entryに対応したモデルを作成してみましょう。モデルクラス名をBookmarkEntryとして、次のコマンドで作成します。

[リスト14]BookmarkEntryモデル作成
$ ./Bookmark/script/bookmark_create.pl model BookmarkEntry Adaptor Bookmark::API::Entry

 BookmarkEntryを使用したlistアクションをRoot.pmに追加します。実装は次のようになります。

[リスト15]BookmarkEntryモデルを使用したlistアクション
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スクリプトは次のようになります。

[リスト16]Bookmark/script/entry-list.pl
#!/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のビュープログラミングについて、サンプルを交えつつ説明していく予定です。

参考資料

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
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

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4788 2010/06/21 19:56

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー