- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- ソース を表示
- Perl-Catalyst/Controller/Chainedアクション へ行く。
- 1 (2009-07-01 (水) 22:30:19)
- 2 (2009-08-19 (水) 19:23:29)
Chainedアクション
何のためにあるのか?
Catalystは原則的にコントローラークラスのクラス名やメソッド名がURLの素になる。逆に言うと、URLによって、クラス名やメソッド名が決まってしまう。その関係を断ち切るためにある。
使い方
以下の3つのアトリビュートをメソッドに指定する。
- Chained ここで指定されたメソッドを実行後、このメソッドを実行する
- PathPart URLの一部分になる
- CaptureArgs/Args 引数をどうとるか
具体例
以下がサンプルのコントローラクラス。
package MyApp::Controller::Test; sub a : Chained('/') PathPart('A') CaptureArgs(0) { } sub b : Chained('a') PathPart('B') CaptureArgs(0) { } sub c : Chained('b') PathPart('C') Args(0) { }
Chained
この場合、http://localhost/A/B/Cでアクセス可能になる。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
PathPartで、A B Cで指定しているので、URLとしては、A B Cが採用される。メソッド名であるa b cおよびクラス名であるTestはURLとは関係が断ち切られる。PathPart('B')を('X')に変えれば、URLはhttp://localhost/A/X/Cになる。
CaptureArgs/Args
CaptureArgs/Argsについてはすべて(0)を指定しているので、引数は取らない。もしsub bをCaptureArgs(1)にしたら、URLはhttp://localhost/A/B/*/Cになる。なお、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.pl MyAppして、上のようなサンプルクラスを作り、myapp_server.plで画面に出力される"Loaded Chained actions:"の内容をよく見ると、挙動がつかめると思う。