« 9月22日の行動 | メイン | 軽快なケイ »
2005年09月22日
[技術] Catalystのサンプルアプリ
Perlのウェブアプリ開発フレームワークCatalystでサンプルアプリを作成する手順
Catalystのインストールや簡単な使い方は下記のはてなの伊藤さんのブログを参照してください。
http://naoya.dyndns.org/~naoya/mt/archives/001682.html
※Catalystのインストールはコマンドライン一発でOKではありません。結構手間取ります。
蔵書登録のサンプルアプリの作成手順は以下の通り
【Catalystで蔵書登録のサンプルアプリの作成】
1) CatalystのProject作成
[y-ishiha@tama catalyst]$ catalyst.pl BookShelf
created "BookShelf"
created "BookShelf/script"
created "BookShelf/lib"
created "BookShelf/root"
created "BookShelf/t"
created "BookShelf/t/m"
created "BookShelf/t/v"
created "BookShelf/t/c"
created "BookShelf/lib/BookShelf"
created "BookShelf/lib/BookShelf/M"
created "BookShelf/lib/BookShelf/V"
created "BookShelf/lib/BookShelf/C"
created "BookShelf/lib/BookShelf.pm"
created "BookShelf/Build.PL"
created "BookShelf/Makefile.PL"
created "BookShelf/README"
created "BookShelf/Changes"
created "BookShelf/t/01app.t"
created "BookShelf/t/02pod.t"
created "BookShelf/t/03podcoverage.t"
created "BookShelf/script/bookshelf_cgi.pl"
created "BookShelf/script/bookshelf_fastcgi.pl"
created "BookShelf/script/bookshelf_server.pl"
created "BookShelf/script/bookshelf_test.pl"
created "BookShelf/script/bookshelf_create.pl"
2) テーブル定義作成
------------- BookShelf/script/bookshelf.sql
CREATE TABLE author (
id serial PRIMARY KEY NOT NULL,
name text NOT NULL,
regdate timestamp DEFAULT now(),
moddate timestamp DEFAULT now()
);
CREATE TABLE book (
id serial PRIMARY KEY NOT NULL,
title text NOT NULL,
authorid integer NOT NULL REFERENCES author(id),
regdate timestamp DEFAULT now(),
moddate timestamp DEFAULT now()
);
--------------------------------------------------------------
テーブル定義に参照制約(REFERENCES author(id))をつけておくと
authorのインスタンスにbooksというアクセスサーが作られ、リレーション
している、bookのインスタンスにアクセスできる。
3) DB作成
[y-ishiha@tama catalyst]$ createdb -E utf8 bookshelf
CREATE DATABASE
[y-ishiha@tama catalyst]$ psql -e bookshelf < BookShelf/script/bookshelf.sql
CREATE TABLE author (
id serial PRIMARY KEY NOT NULL,
name text NOT NULL,
regdate timestamp DEFAULT now(),
moddate timestamp DEFAULT now()
);
NOTICE: CREATE TABLE will create implicit sequence "author_id_seq" for "serial" column "author.id"
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "author_pkey" for table "author"
CREATE TABLE
CREATE TABLE book (
id serial PRIMARY KEY NOT NULL,
title text NOT NULL,
authorid integer NOT NULL REFERENCES author(id),
regdate timestamp DEFAULT now(),
moddate timestamp DEFAULT now()
);
NOTICE: CREATE TABLE will create implicit sequence "book_id_seq" for "serial" column "book.id"
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "book_pkey" for table "book"
CREATE TABLE
4) model作成
4.1) modelクラスの生成
[y-ishiha@tama catalyst]$ ./BookShelf/script/bookshelf_create.pl model DB CDBI dbi:Pg:dbna
me=bookshelf y-ishiha
created "/home/y-ishiha/public_html/catalyst/BookShelf/script/../lib/BookShelf/M/DB.pm"
created "/home/y-ishiha/public_html/catalyst/BookShelf/script/../lib/BookShelf/M/DB"
created "/home/y-ishiha/public_html/catalyst/BookShelf/script/../lib/BookShelf/M/DB/Author.pm"
created "/home/y-ishiha/public_html/catalyst/BookShelf/script/../lib/BookShelf/M/DB/Book.pm"
created "/home/y-ishiha/public_html/catalyst/BookShelf/script/../t/m/pg_author.t"
created "/home/y-ishiha/public_html/catalyst/BookShelf/script/../t/m/pg_book.t"
4.2) modelクラスにコード追加
BookShelf/lib/BookShelf/M/DB.pmのconfigのoptionsにAutoCommit=>1を追加
__PACKAGE__->config(
dsn => 'dbi:Pg:dbname=bookshelf',
user => 'y-ishiha',
password => '',
options => {AutoCommit => 1},
relationships => 1
);
5) view作成
5.1) viewクラスの生成
[y-ishiha@tama catalyst]$ ./BookShelf/script/bookshelf_create.pl view TT TT
created "/home/y-ishiha/public_html/catalyst/BookShelf/script/../lib/BookShelf/V/TT.pm"
created "/home/y-ishiha/public_html/catalyst/BookShelf/script/../t/v/tt.t"
5.2)BookShelf/lib/BookShelf.pmにテンプレートファイルのパスを追加
BookShelf->config( name => 'BookShelf',
templates => {
kanri => 'kanri.tt'
}
);
5.3) BookShelf/root/kanri.ttの作成
------------------
<html>
<head>
<title>登録画面</title>
</head>
<body>
<h2>登録画面</h2>
<hr>
<h2>著者登録</h2>
<form action="/regist_author">
<label for="author">著者名</label>
<input type="text" id="author" name="author" />
<input type="submit" value="登録" />
</form>
<hr>
<h2>蔵書登録</h2>
<form action="/regist_book">
<label for="author_select">著者名</label>
<select name="authorid" id="author_select">
[% FOR auth = authors %]
<option value="[% auth.id %]">[% auth.id %] [% auth.name %]</option>
[% END %]
</select>
<label for="title">タイトル</label>
<input type="text" id="title" name="title" />
<input type="submit" value="登録" />
</form>
<hr>
<h2>蔵書リスト</h2>
<form action="/list_all" />
<input type="submit" value="全蔵書" />
</form>
<form action="/list_by_author" />
<label for="author_select">著者名</label>
<select name="authorid" id="author_select">
[% FOR author = authors %]
<option value="[% author.id %]">[% author.id %] [% author.name %]</option>
[% END %]
</select>
<input type="submit" value="著者別蔵書" />
</form>
<hr>
<table>
<tr>
<th>タイトル</th>
<th>著者</th>
<th>登録日時</th>
</tr>
[% FOR author = authors %]
[% FOR book = author.books %]
<tr>
<td>[% author.name %]</td>
<td>[% book.title %]</td>
<td>[% book.regdate %]</td>
</tr>
[% END %]
[% END %]
</table>
</body>
</html>
------------------
6) controll作成
6.1) controllクラスの生成
[y-ishiha@tama catalyst]$ ./BookShelf/script/bookshelf_create.pl controller Author
created "/home/y-ishiha/public_html/catalyst/BookShelf/script/../lib/BookShelf/C/Author.pm"
created "/home/y-ishiha/public_html/catalyst/BookShelf/script/../t/c/author.t"
[y-ishiha@tama catalyst]$ ./BookShelf/script/bookshelf_create.pl controller Book
created "/home/y-ishiha/public_html/catalyst/BookShelf/script/../lib/BookShelf/C/Book.pm"
created "/home/y-ishiha/public_html/catalyst/BookShelf/script/../t/c/book.t"
6.2) BookShelf.pmにコード追加
sub kanri : Global {
## 初期画面の表示
my ( $self, $c ) = @_;
# DBのauthorテーブルのレコードを全て取得
my @authors = BookShelf::M::DB::Author->retrieve_all();
# DBから取得したレコードを保持したインスタンスの配列をTemplateToolkitに渡す
$c->stash->{authors} = \@authors;
# TemplateToolkitへテンプレートファイルへのパスを渡す
$c->stash->{template} = $c->config->{templates}->{kanri};
# TemplateToolkitを呼び出す
$c->forward('BookShelf::V::TT');
}
6.3) Author.pmにコード追加
sub regist_author : Global {
my ( $self, $c ) = @_;
my $name = $c->req->param('author');
BookShelf::M::DB::Author->create({name=>$name});
my @authors = BookShelf::M::DB::Author->retrieve_all();
$c->stash->{authors} = \@authors;
$c->stash->{template} = $c->config->{templates}->{kanri};
$c->forward('BookShelf::V::TT');
}
6.4) Book.pmにコード追加
sub regist_book : Global {
my ( $self, $c ) = @_;
my $authorid = $c->req->param('authorid');
my $title = $c->req->param('title');
my $book = BookShelf::M::DB::Book->find_or_create({title=>$title, authorid=>$authorid})\
;
$book->update();
my @authors = BookShelf::M::DB::Author->retrieve_all();
$c->stash->{authors} = \@authors;
$c->stash->{template} = $c->config->{templates}->{kanri};
$c->forward('BookShelf::V::TT');
}
7) 実行方法
% ./BookShelf/script/bookshelf_server.pl
8) ブラウザでアクセスするには、http://localhost:3000/kanri
----------------------------------------------
これらのソース一式は、BookShelf.tar.gzです。
投稿者 nekobara : 2005年09月22日 09:12
トラックバック
このエントリーのトラックバックURL:
http://www.ishihara.ne.jp/mt/mt-tb.cgi/604
コメント
こんにちは!いつも楽しくBlog読んでます!
私もいきなり、CPAN から Catalyst モジュール
をインストールがつまずいております(^^;;
また再挑戦せねば・・・
投稿者 Anonymous : 2005年09月22日 19:59
すいません上記コメント私です。
Anonymousはこまりますよね
投稿者 Y後藤 : 2005年09月22日 20:02
後藤さん、こんばんは。
とにかく、しつこく何度も、install Hogeをやるしかないっす。
検討祈る
投稿者 nekobara : 2005年09月22日 20:11