Catalystの履歴

perlフレームワークの一つ。

良くあるMVCモデルで設計、開発ができる。

が、mod_perlfastcgi 環境で動作させることがもっぱらなため「気軽に使える」フレームワークではない。

メモリの食いすぎ(Catalystだけでもないだろうけど…)にも注意。

本番系で動作させる前に、Catalyst Advent Calendarを一読したほうが良い。

参照する資料集

Catalystのマニュアル イントロ編 - http://search.cpan.org/~hkclark/Catalyst-Manual-5.7020/lib/C...

Advent Calendar Articles - http://dev.catalystframework.org/wiki/adventcalendararticles

開発

Controllerはどこにどうやって作ればいいの?

Controllerの作り方は割愛。とりあえず、

$./script/myapp_create.pl Controller Somepath

とすれば、それなりの場所にMyApp::Controller::Somepathが作られる。ここでは、Controllerのメソッドの種類と動きについて簡単にまとめる。

sub method : Local

メソッド名がパス名として作成される。

たとえば、MyPageというControllerがある場合、URLは

http://mydomain/mypage/method

になる。

sub method : Global

メソッド名がアプリケーションのルートからのパス名として作成される。
たとえば、MyPageというControllerがあるでも場合、URLは

http://mydomain/method

になる。

じゃあ、Global属性なんていつ使うのかって? そんなもの必要ないんじゃないかって?

そんなことはない。これがまた便利なんだ。

たとえば、ユーザーがログインしている状態じゃないと使えない機能があったとしよう。

このとき、ログイン状態じゃないと使えない機能/パスをMyPageコントローラに集約する。

そして、MyPageコントローラの auto : Private メソッドにこのような感じで書いておくことにしよう。

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

unless ( $c->session->{some_loggingin_information} ) {
$c->forward( '/loginpage' );
return;
}
}


そうすると、MyPageコントローラの各メソッドが実行される前に自動的にこの auto メソッドが実行されるようになる。

そして、ここで Global 属性が役に立つ。ログインが必要なものについて、MyPageコントローラに Global 属性として記述しておくと、これらが Global 属性として実行される。

  • - Rootコントローラ --

sub page1 : Local {}
sub page2 : Local {}

  • - MyPageコントローラ --

sub mypage1 : Global {}
sub mpage1 : Global {}


するとこんな構成のURLにすることができる。

http://mydomain/page1 ← Rootコントローラーが処理
http://mydomain/page2 ← Rootコントローラーが処理
http://mydomain/mypage1 ← MyPageコントローラーが処理
http://mydomain/mypage2 ← MyPageコントローラーが処理


すると、MyPageコントローラが行う処理は自動的にログインしていないと使えないようになる。

これは便利

sub method : Path('pathname')

Path の引数がURLとして利用される。

引数がない場合、メソッド名を無視してそのまま使われるっぽい。Args( arg_num )と一緒にして使うと便利

sub method : Path : Args( 引数の数 )

こんな感じのURLを作れる。

http://mydomain/path/ ← method : Path : Args(0)
http://mydomain/path/1/ ← method : Path : Args(1)
http://mydomain/path/1/2/ ← method : Path : Args(2)


これで、同じコントローラでURLのパスを引数にして、引数の数ごとに異なるメソッドを起動できるようになる。

なお、引数はこんな感じで受け取る。

sub method : Path : Args(2) {
my ( $self, $c, $arg1, $arg2 ) = @_;
}


ちなみに、引数はバイナリで格納されているので、文字列として利用する場合にしかるべきエンコード(たとえば、SJIS、cp932、EUC、UTF8など。UTF8の場合であっても、utf8フラグを立てる必要がある。)からUTF8にデコードを行う必要がある。(perlでuse utf8している場合)

method : Chained

楽しいことができる。後で書く

テスト(自動化編)

  • -勉強中--

運用

メモリの食いすぎについて

Catalystメモリがどんどん消費されていく件については、ベストプラクティス的にCatalyst Advent Calendar - Day 18に書かれている。