Chainedアクション

何のためにあるのか?

Catalystは原則的にコントローラークラスのクラス名やメソッド名がURLの素になる。逆に言うと、URLによって、クラス名やメソッド名が決まってしまう。その関係を断ち切るためにある。

使い方

下の例にあるように、コントローラクラスのアクションメソッドで、3つのアトリビュート(Chaind, PathPart, CaptureArgs/Args)を指定する。

 sub doFoo : Chained('doBar') PathPart('foo') CaptureArgs(0) { }

具体例

以下がサンプルのコントローラクラス。このサンプルはhttp://localhost/A/B/Cでリクエスト出来る。

 package MyApp::Controller::Test;
 
 use base 'Catalyst::Controller';
 
 sub a : Chained('/') PathPart('A') CaptureArgs(0) { }
 sub b : Chained('a') PathPart('B') CaptureArgs(0) { }
 sub c : Chained('b') PathPart('C') Args(0) { }
 
 1;

Chained

メソッドの実行順番を決める。Catalystでは、あるメソッドは、Chainedで指定したメソッドを実行した後に、実行される。サンプルでは、

  • sub cのChained('b')のbはsub bのbに相当する。
  • sub bのChained('a')のaはsub aのaに相当する。
  • sub aでChained('/')になっているが、これはこれ以上チェーンがない事を意味する。
  • (すなわち、どのような構成のURLであろうと、(メソッドを遡って)最後にはChained('/')が必要。)

以上のようなわけで、このサンプルではリクエストを受けると、Catalystはsub a→sub b→sub cの順番でメソッドを実行する。

PathPart

URLの表記を決める。

  • Chainedによってsub a→sub b→sub cでメソッドが実行されるが、
  • 対応するPathPartはA→B→C、
  • 従って、URLはhttp://localhost/A/B/Cになる。
  • もしPathPart('B')を('X')に変えれば、URLはhttp://localhost/A/X/Cになる。

このようにChainedアクションを使うと、メソッド名(a,b,c)およびクラス名(Test)はURLと関係が断ち切られる。

CaptureArgs/Args

引数をどう取るか決める。このサンプルではすべて(0)を指定しているので、引数は取らない。 もしsub bをCaptureArgs(1)すると、URLはhttp://localhost/A/B/*/Cになる。

CaptureArgsとArgsの違い

  • URLの最後の部分(PathPart('C'))のメソッド(sub c)はCaptureArgsではなくArgsを使わなければ行けない。
  • しかし、URLの先頭(PathPart('A'))や途中(PathPart('B'))のメソッド(sub a及びsub b)はCaptureArgsでもArgsでも良い。
  • もしsub bをArgs(0)にすると、http://localhost/A/B/Cに加え、http://localhost/A/BというURLでもリクエスト出来るようになる。

最後に

以上の通りだけれど、慣れるまで分かりづらいので(例えば、PathPartやArgsの()を省略すると挙動が変わる)、Catalystをインストールしたマシンで、

 catalyst.pl MyApp

を実行して、MyApp/lib/MyApp/Controller/Test.pmとして上のサンプルクラスを作り、

 ./myapp_server.pl -r

を実行し、ブラウザでhttp://localhost:3000/A/B/Cにアクセスしてみる。そこで、デバッグコンソールに出力される"Loaded Chained actions:"の内容をよく見ると、挙動がつかめると思う。

参考

http://gihyo.jp/dev/serial/01/modern-perl/0007?page=1


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS

Last-modified: 2009-11-27 (金) 06:12:30