* Chainedアクション [#w68f61cd]

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

** 使い方 [#h4df2f41]

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

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

** 具体例 [#u46bb72a]
以下がサンプルのコントローラクラス。このサンプルは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 [#u63249fa]
メソッドの実行順番を決める。Catalystでは、あるメソッドは、Chainedで指定したメソッドを実行した後に、実行される。サンプルでは、

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

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

*** PathPart [#m60452e5]
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 [#acf90282]
引数をどう取るか決める。このサンプルではすべて(0)を指定しているので、引数は取らない。
もしsub bをCaptureArgs(1)すると、URLはhttp://localhost/A/B/*/Cになる。

*** CaptureArgsとArgsの違い [#c39098fd]
- 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でもリクエスト出来るようになる。

** 最後に [#hb79d1f3]
以上の通りだけれど、慣れるまで分かりづらいので(例えば、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:"の内容をよく見ると、挙動がつかめると思う。

** 参考 [#ad05caf0]
http://gihyo.jp/dev/serial/01/modern-perl/0007?page=1

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