guri_2::perlメモ このページをアンテナに追加 RSSフィード

2008-06-04

チュートリアルを読みながらCatalystサンプルアプリケーションを作ってみる

| 18:38 | チュートリアルを読みながらCatalystサンプルアプリケーションを作ってみる - guri_2::perlメモ を含むブックマーク はてなブックマーク - チュートリアルを読みながらCatalystサンプルアプリケーションを作ってみる - guri_2::perlメモ チュートリアルを読みながらCatalystサンプルアプリケーションを作ってみる - guri_2::perlメモ のブックマークコメント

The CPAN Search Site - search.cpan.org

を読みながら作って、まずはとにかく動かしてみる。

途中のTipsは読んでないので、間違っているところがあるかもしれぬ。


1.プロジェクトを作成する

プロジェクト名は「MyApp」。このコマンドを実行した場所に作られる。

perl catalyst.pl MyApp

2.SQLiteのダウンロード

データベースとしてSQLite3を使用。公式サイトにアクセスし、「sqlitedll-3_5_9.zip」をダウンロード。

SQLite Download Page

解凍して、適当な場所に置く。


3.SQLファイルの作成

チュートリアルをコピー&ペースト。以下のソースをエディタにコピーし、「myapp01.sql」という名前で保存。

--
-- Create a very simple database to hold book and author information
--
CREATE TABLE books (
        id          INTEGER PRIMARY KEY,
        title       TEXT ,
        rating      INTEGER
);
-- 'book_authors' is a many-to-many join table between books & authors
CREATE TABLE book_authors (
        book_id     INTEGER,
        author_id   INTEGER,
        PRIMARY KEY (book_id, author_id)
);
CREATE TABLE authors (
        id          INTEGER PRIMARY KEY,
        first_name  TEXT,
        last_name   TEXT
);
---
--- Load some sample data
---
INSERT INTO books VALUES (1, 'CCSP SNRS Exam Certification Guide', 5);
INSERT INTO books VALUES (2, 'TCP/IP Illustrated, Volume 1', 5);
INSERT INTO books VALUES (3, 'Internetworking with TCP/IP Vol.1', 4);
INSERT INTO books VALUES (4, 'Perl Cookbook', 5);
INSERT INTO books VALUES (5, 'Designing with Web Standards', 5);
INSERT INTO authors VALUES (1, 'Greg', 'Bastien');
INSERT INTO authors VALUES (2, 'Sara', 'Nasseh');
INSERT INTO authors VALUES (3, 'Christian', 'Degu');
INSERT INTO authors VALUES (4, 'Richard', 'Stevens');
INSERT INTO authors VALUES (5, 'Douglas', 'Comer');
INSERT INTO authors VALUES (6, 'Tom', 'Christiansen');
INSERT INTO authors VALUES (7, 'Nathan', 'Torkington');
INSERT INTO authors VALUES (8, 'Jeffrey', 'Zeldman');
INSERT INTO book_authors VALUES (1, 1);
INSERT INTO book_authors VALUES (1, 2);
INSERT INTO book_authors VALUES (1, 3);
INSERT INTO book_authors VALUES (2, 4);
INSERT INTO book_authors VALUES (3, 5);
INSERT INTO book_authors VALUES (4, 6);
INSERT INTO book_authors VALUES (4, 7);
INSERT INTO book_authors VALUES (5, 8);

4.DBの作成

先ほど解凍したdllファイルとsqlファイルを同じディレクトリに置き、以下のコマンドを実行。

sqlite3 myapp.db < myapp01.sql

「myapp.db」というファイルが作られる。

ちゃんと作られているかどうかを、「バージョン確認」「SELECT文発行」してみて確認できる。

sqlite3 myapp.db
SQLite version 3.2.2
Enter ".help" for instructions

sqlite> select * from books;
1|CCSP SNRS Exam Certification Guide|5
2|TCP/IP Illustrated, Volume 1|5
3|Internetworking with TCP/IP Vol.1|4
4|Perl Cookbook|5
5|Designing with Web Standards|5

sqlite> .q

作成したmyapp.dbは、MyAppプロジェクト直下に配置しておく。(C:/MyApp/myapp.db


5.MyAppDB.pmの作成(スキーマ情報ファイル)

lib直下に「MyAppDB.pm」ファイルを作り、以下のように記述。

package MyAppDB;

use base qw/DBIx::Class::Schema/;

__PACKAGE__->load_classes({
    MyAppDB => [qw/Book BookAuthor Author/]
});
    
1;

6.Book.pm、BookAuthor.pm、Author.pmの作成(リソース情報ファイル)

lib/MyAppDBディレクトリを作成し、その中に以下の3つのファイルを作成します。

  • Book.pm
package MyAppDB::Book;
    
use base qw/DBIx::Class/;  
    
# Load required DBIC stuff
__PACKAGE__->load_components(qw/PK::Auto Core/);
# Set the table name
__PACKAGE__->table('books');
# Set columns in table
__PACKAGE__->add_columns(qw/id title rating/);
# Set the primary key for the table
__PACKAGE__->set_primary_key(qw/id/);
    
# has_many():
# カラム名には外部テーブルのキーを記述する
__PACKAGE__->has_many(book_authors => 'MyAppDB::BookAuthor', 'book_id');
    
# many_to_many():
__PACKAGE__->many_to_many(authors => 'book_authors', 'author');

1;
  • Author.pm
package MyAppDB::Author;
    
use base qw/DBIx::Class/;
    
__PACKAGE__->load_components(qw/PK::Auto Core/);
__PACKAGE__->table('authors');
__PACKAGE__->add_columns(qw/id first_name last_name/);
__PACKAGE__->set_primary_key(qw/id/);
    
__PACKAGE__->has_many(book_author => 'MyAppDB::BookAuthor', 'author_id');
__PACKAGE__->many_to_many(books => 'book_author', 'book');
    
1;
  • BookAuthor.pm
package MyAppDB::BookAuthor;
    
use base qw/DBIx::Class/;
    
__PACKAGE__->load_components(qw/PK::Auto Core/);
__PACKAGE__->table('book_authors');
__PACKAGE__->add_columns(qw/book_id author_id/);
__PACKAGE__->set_primary_key(qw/book_id author_id/);
    
# belongs_to():
# カラム名は「この」テーブル
__PACKAGE__->belongs_to(book => 'MyAppDB::Book', 'book_id');
    
# belongs_to():
__PACKAGE__->belongs_to(author => 'MyAppDB::Author', 'author_id');
 
1;

7.モジュールダウンロード

Catalyst::Model::DBIC::Schemaモジュールがないので、ppmを通じてインストールします。

ppm install Catalyst::Model::DBIC::Schema

8.Modelファイルを作成

MyAppにカレントディレクトリを移動し、以下のコマンドを実行。

チュートリアルと違うけど、チュートリアル通りやると、作られたファイルの設定がおかしかったので、

あとで確認する。

perl script/myapp_create.pl model MyAppDB DBIC::Schema MyAppDB dbi:SQLite:myapp.db

dbi:SQLite:myapp:db」(:が1つ)に注意。間違って2つ打っててはまった…。

最後の部分がパスになる。例えば「MyApp/db/myapp.db」という配置だったら、

dbi:SQLite:db/myapp.db」にするといいみたい。試してないけど。


9.Controllerの作成

同様に以下のコマンドを実行。

perl script/myapp_create.pl controller Books

10.Books.pmに関数追加

lib/MyApp/Controller/Books.pmの最後に以下の関数を追加する。

:(中略)
sub list : Local {
	my ($self, $c) = @_;
	$c->stash->{books} = [$c->model('MyAppDB::Book')->all];
	$c->stash->{template} = 'books/list.tt2';
}

1;

11.Viewの作成

以下のコマンドを実行。

perl script/myapp_create.pl view TT TTSite

12.end関数を有効化

チュートリアルではRenderViewというのを設定していたけど、これは無視した。

lib/MyApp/Controller/Root.pmに行き、コメントアウトされているend関数のコメントを消す。

sub end : Private {
    my ( $self, $c ) = @_;

    # Forward to View unless response body is already defined
    $c->forward( $c->view('') ) unless $c->response->body;
}

13.レイアウトファイルの修正

root/lib/site/layoutを以下のように修正。(メッセージ部分の加筆)

<div id="header">[% PROCESS site/header %]</div>
    
<div id="content">
<span class="message">[% status_msg %]</span>
<span class="error">[% error_msg %]</span>
[% content %]
</div>
    
<div id="footer">[% PROCESS site/footer %]</div>

14.テンプレートページの作成

root/src/booksというディレクトリを作り、その中に「list.tt2」ファイルを作る。

list.tt2は以下のように記述。

[% META title = 'Book List' -%]
    
<table>
<tr><th>Title</th><th>Rating</th><th>Author(s)</th></tr>
[% FOREACH book IN books -%]
  <tr>
    <td>[% book.title %]</td>
    <td>[% book.rating %]</td>
    <td>
      [% tt_authors = [ ];
         tt_authors.push(author.last_name) FOREACH author = book.authors %]
      ([% tt_authors.size %])
      [% tt_authors.join(', ') %]
    </td>
  </tr>
[% END -%]
</table>

これで実装は完了。


15.起動とアクセス

コマンドでサーバ起動。restartオプションを入れておくと、ファイルを編集した際に即時反映されるらしい。

perl script/myapp_server.pl -restart

http://localhost:3000/books/list」にアクセスすればテーブルの中身が表示されるはず。

JalenJalen2011/06/05 16:35BION I'm ipmreessd! Cool post!

ltuvtdyoovltuvtdyoov2011/06/05 17:36SJpyXY <a href="http://hudzyppcqnac.com/">hudzyppcqnac</a>

wereeywereey2011/06/06 22:34Rl1hwy , [url=http://dedxmopjjlcx.com/]dedxmopjjlcx[/url], [link=http://vddxvlskprnw.com/]vddxvlskprnw[/link], http://jxqlhdnejoho.com/

gpygnixxjgpygnixxj2011/06/07 18:43uTSLFy <a href="http://mnsbvpsuigvv.com/">mnsbvpsuigvv</a>

hnrgzqkhnrgzqk2011/06/09 19:33Vwwbvg , [url=http://lswxttvkylsf.com/]lswxttvkylsf[/url], [link=http://zsuunjgpnmyj.com/]zsuunjgpnmyj[/link], http://taflgtroijpn.com/