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で指定したメソッドを実行した後に、実行される。サンプルでは、
以上のようなわけで、このサンプルではリクエストを受けると、Catalystはsub a→sub b→sub cの順番でメソッドを実行する。 PathPartURLの表記を決める。
このようにChainedアクションを使うと、メソッド名(a,b,c)およびクラス名(Test)はURLと関係が断ち切られる。 CaptureArgs/Args引数をどう取るか決める。このサンプルではすべて(0)を指定しているので、引数は取らない。 もしsub bをCaptureArgs(1)すると、URLはhttp://localhost/A/B/*/Cになる。 CaptureArgsとArgsの違い
最後に以上の通りだけれど、慣れるまで分かりづらいので(例えば、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:"の内容をよく見ると、挙動がつかめると思う。 参考 |
|