CodeZine(コードジン)

特集ページ一覧

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

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

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2010/02/04 14:00
目次

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

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

[リスト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のビュープログラミングについて、サンプルを交えつつ説明していく予定です。

参考資料



  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

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

もっと読む

著者プロフィール

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XM...

  • WINGSプロジェクト 花田 善仁(ハナダ ヨシヒト)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5