あばばばばCatalyst

やっべ、放置しすぎ。最近Perlあんまり触ってなかったから滞ってました。


とりあえず今の課題を従来のASP+VB以外でやっていいという許可をセンセからいただいたのでレッツCatalyst、と行って見たいかと。


もはや「いまさら知ってるよ!」的な備忘録を。環境はとりあえずWindowsで。

インストール

パス。(ぇ
とりあえずcharsbarさんとこのtcoolのリポジトリ

ppm rep add tcool http://ppm.tcool.org/server/ppmserver.cgi?urn:PPMServer

してppm install Task::Catalystでなんとかなるはずです。足りなかったらあとで継ぎ足そう。

ヘルパーでスケルトンを作る

便利なヘルパースクリプト群。
雛形を作ってくれるってすばらしい。あぁすばらしい。
シンプルなBBSでも作ってみようと思います。catalystコマンドで

Z:\>catalyst TestBBS
#以下ズラーっと何か作ってる

-shortを加えるとModel/View/Controllerのモジュール名をM/V/Cにしてくれるみたいです。TestBBS::Model::LogがTestBBS::M::Logの様になるみたいです。でも今回は長いほうで行こう。
-forceを加えるとスケルトンの古いヘルパースクリプトを上書きしてくれるみたいです。

わーいできたー

アプリケーションできたよ!
というのは冗談でとりあえず何か出来たら動かしたくなるもの&ヘルパーの凄さを確認するため。
scriptディレクトリに移動してperl testbbs_server.plです。
Z:\
おー動いたー(棒読

-rと加えるとモジュールを書き換えたときに勝手にリロードしてくれるみたいです。たとえば

#lib/TestBBS/Controller/Root.pm
sub default : Private {
    my ( $self, $c ) = @_;

    # Hello World
    $c->response->body( "foobar" );
}

なんて適当に変えてみても

File(s) "Z:\TestBBS\lib\TestBBS\Controller\Root.pm" modified, restarting

なんて出て勝手にrestartしてくれます。すげー。


とりあえずスケルトン作成までを。新しい機能いっぱいついててオレ進化してねー&Catalyst進化早すぎーと思った。

いまCataその1

いまPlaならぬいまCata。そんなに役に立つとも思えないけれど。

MVC

Catalystはいわずと知れたMVCフレームワークなのでザッっとMVC。こいつもヘルパースクリプトで作ってしまう。

とりあえずC

とりあえずいろいろ作る前にlibディレクトリをいろいろと見てみる。

なんてことはないモジュールの集まり(当たり前)
TestBBS.pmとTestBBSディレクトリがあってそのディレクトリの中にModelとViewとControllerディレクトリがある。
ひとつだけ、Root.pmって言うのがControllerの中にありました。
かなり前の記憶でたしかTestBBS.pmに書いてたよなぁとかいう記憶があったんですけど、PODとコメント見るとTestBBS.pmには初期化とかフラグを設定しろみたいに書いてあるのでルート直下にアクションを書くときはRoot.pmに書くみたいです。とりあえずの記憶で

#lib/TestBBS/Controller/Root.pm に追加
sub Test : Global {
    my ( $self, $c ) = @_;

    $c->response->body( "aaaaaaaaaa" );
}

これでlocalhost:3000/Testとやったらちゃんとaaaaaaaaaaと表示されました。わーい。

GlobalとかPrivateとかRegexとかLocalとかとか

ルートだけじゃやっぱり足りなくなるし、足らなくならなかったとしても意味分けすると言う意味で分ける必要があるのでControllerを作ります。それも簡単ヘルパーにお任せ。scriptディレクトリに移動して、

Z:\TestBBS\script>testbbs_create.pl controller <好きなコントローラ名>。

ここでは書き込みが必要じゃないかな、と思ってwriteとviewを追加(適当)。
そして出来たTestBBS::WriteとかRoot.pmとかにがしがし書いていけばいいんですが、

sub write : Local {
  my($self,$c,@args) = shift;
  #何かする
}

みたいにコロンのあとに属性を書きます。その属性は何かというと与えられたURLに対してどんな動作をするか定義をするわけです。

その属性は今、Path, Regex, LocalRegex, Global, Local, Privateがあります。

Global

どのコントローラに定義してもルート+メソッド名にマッチ。しかしRoot.pmにその名前があるとそっちが呼ばれます。

#TestBBS::Controller::Write
sub view : Global {
  my ( $self, $c ) = @_;
  $c->response->body('view method on write');
}

これでlocalhost:3000/viewと呼ぶと上のメソッドが呼ばれる。しかし

#TestBBS::Controller::Root
sub view : Local {
  my ( $self, $c ) = @_;
  $c->response->body('view method on root');
}

このようにRoot.pmに何かしら定義されているとRoot.pmのものが呼ばれるっぽい。

TestBBS::Controller::View::viewとか
TestBBS::Controller::View::Child::viewとか
TestBBS::Controller::View::Child::Son::viewとか作ってどんな挙動かみてみたんですけど、rootからのトップダウンかと思ったんですがなんか違ったみたい、Child->Root->Sonって制御が移る。挙動わかんない。

また明日これと他の属性を調べよう。