インストールに続いて、PerlフレームワークCatalystに触れてみたメモ。
MVCの説明をばっさり省略して、とにかく超簡単に動かしてみます。Let's try!
参考
Catalyst-Manual-Tutrial(CPAN Catalyst::Manual::Tutorial)
Catalyst-Manual-Intro(CPAN Catalyst::Manual::Intro)
オイラの環境
Catalyst 5.7015 (perl -MCatalyst -e 'print $Catalyst::VERSION."\n"')
Perl 5.8.6
Apache 1.3.41 (テストなので mod_perl や fcgi 環境は利用せず)
Vine Linux4.2 (Kernel2.6.1)
Catalyst はインストールしたらすぐ起動できる
「cpan -i Task::Catalyst」でインストールが完了したら、早速 Catalyst を動かしてみます。
適当なディレクトリに移動して、以下のコマンドを実行します。
# catalyst.pl MyApp
ずらずらっとファイルとディレクトリが作成されたログのようなものが表示されるかと思います。
なんと、たったのこれだけで、MyApp を実行する準備が整います。
(Catalystにはあらかじめ軽量のhttpサーバとテスト・フレームワークが用意されているのです!)
というわけで、以下のように MyApp を起動してみましょう。
# cd MyApp # script/myapp_server.pl -r
*「-r」オプションをつけておくと、ファイルの変更を自動的に検知して更新してくれます。
デバッグモードで動くはずなので、シェルには様々な情報が表示されます。
[debug] Debug messages enabled [debug] Statistics enabled [debug] Loaded plugins: .----------------------------------------------------------------------------. | Catalyst::Plugin::ConfigLoader 0.21 | | Catalyst::Plugin::Static::Simple 0.20 | '----------------------------------------------------------------------------' [debug] Loaded dispatcher "Catalyst::Dispatcher" -- snip -- [debug] Loaded Path actions: .-------------------------------------+--------------------------------------. | Path | Private | +-------------------------------------+--------------------------------------+ | / | /default | | / | /index | '-------------------------------------+--------------------------------------' [info] MyApp powered by Catalyst 5.7015 You can connect to your server at http://localhost:3000
最後の「You can connect to your server at http://localhost:3000」が表示されてればひとまずOK。
書かれてある通りに、http://localhost:3000/ にアクセスすると、以下のようなページが表示されるかと思います。
おまえの MyApp は、もうすでに動いている!
Hello, World!
さて、ナニはなくとも Hello, World! ですよね。
シンプルに [http://localhost:3000/hello] にアクセスすると、「Hello, World!」と表示されるようにしてみましょう。
MyApp/lib/MyApp/Controller/Root.pm を編集します。
以下のように、hello メソッド(太字のブロック)を Root.pm の POD の手前辺りに挿入しましょう(基本どこでも良いですが)。
(手前省略) __PACKAGE__->config->{namespace} = '';
sub hello : Global {
my ($self, $c) = @_;
$c->response->body('Hello, World!');
}=head1 NAME
(以下省略)
見たこともない「sub hello : Global」という メソッド(サブルーチン/関数)の書き方がされていますが、現時点では無視して進みましょう。
編集できたら、[http://localhost:3000/hello] にアクセスしてみます。
無事、「Hello, World!」ページが表示されればOKです。
アクション
「Hello, World!」の実装を、Catalyst的用語で言い換えると、
[http://localhost:3000/hello] という URL に対する hello“アクション”を定義し、「Hello, World!」ページを表示した
という風になります。
キーワードは “アクション” です。アクションとはつまり sub のことです。
Catalyst では、URL を “ベース” と “パス” のふたつに分けて考えます。
例えば、URL が http://localhost:3000/hello なら、
ベースが http://localhost:3000/ で、パスが hello です。
Catalyst では URL のパス部分に対する sub (アクション) を定義することで機能を実装していきます。
Catalystの初期ファイル構成
さて、挨拶(Hello, World!)が済んだところで、Catalyst が具体的にどういった構成であるかをのぞいてみましょう。
現時点で、カレントディレクトリに生成された MyApp/ 以下に次のようなディレクトリ&ファイル群が生成されています。
(Catalystのバージョンによって多少違うことがあると思います)
Changes # アプリの変更履歴
/lib/ # Perlモジュールを格納するディレクトリ
/MyApp/ # アプリケーションのコードを格納するディレクトリ
/Controller/ # Controllerモジュールを格納するディレクトリ
Root.pm # 初期アクション定義がされているモジュール(すでに編集したものです)
/Model/ # Modelsモジュールを格納するディレクトリ
/View/ # Viewsモジュールを格納するディレクトリ
MyApp.pm # アプリケーションのBaseモジュール
Makefile.PL # アプリケーションを構築するMakefile.PL
myapp.conf # アプリケーションのconfiguration file
README # README
/root/ # templates, css, javascript置き場
favicon.ico
/static/ # 静的ファイル置き場
/images/ # welcome画面で使用される画像ファイル置き場
/script/ # Perlスクリプト(ヘルパースクリプト?)のディレクトリ
myapp_cgi.pl
myapp_create.pl
myapp_fastcgi.pl
myapp_server.pl
myapp_test.pl
/t/ # testスクリプト用のディレクトリ
01app.t
02pod.t
03podcoverage.t
たくさんのファイル&ディレクトリがありますが、現段階で注目すべきは /script/ です。
Catalyst では、/script/ 以下の Perl スクリプト(ヘルパー・スクリプトと呼ばれる)でいろいろな機能を簡単に追加・作成していくことができるのです。
ヘルパー・スクリプトによるアクションの生成
では、ヘルパー・スクリプトでひとつ簡単な機能を実装してみましょう。
以下のURLで「Hi!」と表示するようにしてみましょう。
http://localhost:3000/hi
やることは Hello, World! と同じですが、
ヘルパースクリプトで新たなアクション(sub)を生成して行います。
# script/myapp_create.pl controller hi
上記コマンドで、アプリケーションのルートディレクトリ /Myapp/ 以下に次のファイルが新たに生成されます。
- MyApp/lib/MyApp/Controller/hi.pm # helloアクションを実装するためのモジュール
- MyApp/t/controller_hi.t # テストスクリプト
色々と深く考えるのはよして、MyApp/lib/MyApp/Controller/hi.pm を編集しましょう。
以下の部分を見つけます。(hi.pm はすぐ POD がはじまりますが、少し下にスクロールするとあります。)
sub index :Path :Args(0) {
my ( $self, $c ) = @_;
$c->response->body('Matched MyApp::Controller::hi in hi.');
}
以下のように1箇所編集します。
$c->response->body('Matched MyApp::Controller::hi in hi.');
↓ ↓ ↓
$c->response->body('Hi!');
これで、「Hi!」の表示が実装できました。
[http://localhost:3000/hi] にアクセスしてみましょう。
無事、「Hi!」と表示されていればOKです。
テンプレートで表示
Hi! を今度はテンプレートを使用して表示します。
Catalyst では表示部分を Template Toolkit や HTML::Template といったモジュールで処理できます。
テンプレート表示のための一連も、ヘルパー・スクリプトがやってくれます。楽。
# script/myapp_create.pl view TT TT
上記コマンドで2つのファイルが生成されます。
- MyApp/lib/MyApp/View/TT.pm # Catalyst::View::TTのサブクラス
- MyApp/t/view_TT.t # テストスクリプト
そして、テンプレートファイルを用意します(これは手動)。
MyApp/root/hi.tt を以下のような内容で作成します。
<p>Hi! Catalyst!</p>
さらに、前にこしらえた MyApp/lib/MyApp/Controller/hi.pm の1行を以下のように編集します。
$c->response->body('Hi!');
↓ ↓ ↓
$c->stash->{template} = 'hi.tt';
ふたたび [http://localhost:3000/hi] にアクセスしてみましょう。
今度は、「Hi! Catalyst!」と表示されているはずです。
クエリーで値を受ける
続いて、クエリーを受け取って、ページを書き換えるようにしましょう。
MyApp/root/hi.tt を以下のような内容に変更します。
<p>Hi! [% username | html %]!</p>
そして、みたび MyApp/lib/MyApp/Controller/hi.pm を以下のように編集します。
$c->stash->{template} = 'hi.tt';
↓ ↓ ↓
$c->stash->{template} = 'hi.tt';
$c->stash->{username} = $c->req->param('name') || 'Catalyst'; # この行追加
以下のURLにアクセスすると、「Hi! Jack!」と表示されます。
http://localhost:3000/hi?name=Jack
ちなみに、[http://localhost:3000/hi] なら「Hi! Catalyst!」のままです(当たり前か(^_^;))。
おお、なんか Catalystアプリケーションできそうな予感!!
とか思えたら幸いです。
