いま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って制御が移る。挙動わかんない。

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