古い記事
ランダムジャンプ
新しい記事
WEB+DB PRESS Vol.32 の id:naoya さんの書いた Catalyst 入門記事の
インストラクションに従って実行してみたメモ。

WEB+DB PRESS Vol.32


記事では Catalyst 5.65 だそうだが、インストールしてみたら、
Catalyst 5.67 であった。すでに記事の内容と異なる箇所もあり、
開発の速さを感じた。

そのまま書いてある通りにやれば簡単に追体験できるかと思いきや、
かなり時間がかかった。なかなか手ごわいな、Catalyst。


■インストール

本文にも書いてあったが、すごく時間がかかる。ほんとに。
% sudo perl -MCPAN -e 'install Task::Catalyst'


■動かしてみる

% catalyst.pl MyApp
% cd MyApp
% script/myapp_server.pl -r
ブラウザで「http://localhost:3000/」にアクセスしてみる。ktkr!!!

% emacs lib/MyApp.pm (追加)

sub hello : Local {
   my ($self, $c) = @_;
   $c->response->output('Hello, World!');
}
ブラウザで「http://localhost:3000/hello」にアクセスし、
「Hello, World!」の表示を確認。嬉しい!

※なお、p.161のリスト1(MyApp.pm)は、v5.67 では default メソッドが
lib/MyApp/Controller/Root.pm に移っており、だいぶ様相が異なっている。


■コントローラの作成

% script/myapp_create.pl controller Foo
% emacs lib/MyApp/Controller/Foo.pm (追加)

sub default : Private {
   my ( $self, $c ) = @_;
   $c->response->body('hello! /foo');
}
sub bar : Local {
   my ( $self, $c ) = @_;
   $c->response->body('hello! /foo/bar');
}
sub baz : Local {
   my ( $self, $c ) = @_;
   $c->response->body('hello! /foo/baz');
}
ブラウザで「http://localhost:3000/foo
http://localhost:3000/foo/bar
http://localhost:3000/foo/baz」を確認。


■Template Toolkit でビュー

% sudo perl -MCPAN -e 'install Catalyst::Helper'
% sudo perl -MCPAN -e 'install Time::Piece'

% emacs myapp.yml (追加)

View::TT:
 INCLUDE_PATH:
   - 'root/templates'
 TEMPLATE_EXTENSION: '.tt'

% script/myapp_create.pl view TT TT
% emacs lib/MyApp.pm (修正)

use Time::Piece;
sub hello : Local {
   my ($self, $c) = @_;
   $c->stash(now => Time::Piece->new);
   $c->forward($c->view('TT'));
}
(※p.164のソースでは「use Time::Piece;」がない。)

% mkdir root/templates
% root/templates/hello.tt

<html>
<head><title>[% c.config.name %]</title></head>
<body>
<h1>[% c.config.name %]</h1>
<p>Hello! [% now.year %]</p>
</body>
</html>
(※p.164のリスト4はheadタグが閉じられていない。)

ブラウザで「http://localhost:3000/hello」を確認。


■モデルを作る

準備。
% sudo perl -MCPAN -e 'install Catalyst::Helper::Model::CDBI'
% sudo perl -MCPAN -e 'install Class::DBI'
% sudo perl -MCPAN -e 'install Class::DBI::mysql'
% sudo perl -MCPAN -e 'install DBD::mysql'
(※test通らなくても強引にインストールした。)

MySQLのデータ作成。
% mysql
create database myapp;
use myapp;
create table entry (
 id int unsigned auto_increment primary key,
 title varchar(255),
 body text,
 timestamp timestamp
);
insert into entry values (NULL, 'Hello','This is a pen.', NOW());
insert into entry values (NULL, 'Bye','Sayonara!', NOW());
insert into entry values (NULL, 'Oreore','Ore dayo ore!', NOW());

% script/myapp_create.pl model CDBI CDBI dbi:mysql:myapp root
% emacs myapp.yml (追加)

Model::CDBI:
 dsn: 'dbi:mysql:dbname=myapp'
 password: ''
 user: 'root'

% emacs lib/MyApp.pm (書き換え)

sub hello : Local {
   my ($self, $c) = @_;
   my $entries = MyApp::Model::CDBI::Entry->retrieve_all;
   $c->stash(entries => $entries);
   $c->stash(now => Time::Piece->new);
   $c->forward($c->view('TT'));
}
(※タイポ:p.165のソースの「my $entres」→「my $entries」。
行末のセミコロンも抜けてた。)

% root/templates/hello.tt (追加)

<dl>
[% WHILE (entry = entries.next) %]
<dt>[% entry.title %]</dt>
<dd>[% entry.body %]</dd>
[% END %]
</dl>
ブラウザで「http://localhost:3000/hello」にアクセスする。
ちょっと感動!

はまりメモ:
Catalyst の Catalyst::Helper::Model::CDBI でいつもハマる・・・orz
http://www.drk7.jp/MT/archives/001032.html
その2)Can't locate object method "set_sql" とエラーがでる
同じ現象が起こったので drk7 さんのように、
/usr/lib/perl5/site_perl/5.8.8/Class/DBI/Loader.pm
に「require Class::DBI;」を追加した。……。

雑感:
この記事、id:naoya さん以外に事前に通して実行した人いないのかな。
こういう記事って、モニターさん(詳しくない人ね)がたくさん必要かも。