アクションの種類
CatalystのアクションとURLパスとの関連づけを行うアトリビュートには次のようなものがあります。以降ではサンプルアプリケーションを使いながら説明します。
| アトリビュート | パスの指定方法 |
| :Local | ネームスペース+アクション名 |
| :Global | アクション名 |
| :Path | リテラルでパスを指定 |
| :LocalRegex | ローカルな正規表現でパスを指定 |
| :Regex | グローバルな正規表現でパスを指定 |
| :Private | 直接パスに割り当てられず、内部で使用 |
| :Args | 補助的に引数を制限する場合に使用 |
| :Chained | 複数のアクションを連鎖場合に使用 |
では、サンプルアプリケーションのスケルトンを作成しましょう。この例では「HelloC」という名前で作成します(「C」はControllerを意味しています)。
$ catalyst.pl HelloC
本記事のサンプルコードは、すべてUTF-8で保存しています。
ネームスペース前置(:Local)
ネームスペースとメソッド名にマッチするパスを構成するには、「:Local」を指定します。HelloC::Controller::Foo::Barコントローラを例に取ってみましょう。まずHelloC::Controller::Foo::Barを作成するには、次のヘルパスクリプトを実行します。
$ ./HelloC/script/helloc_create.pl controller Foo::Bar
created "/home/test/HelloC/script/../lib/HelloC/Controller/Foo" exists "/home/test/HelloC/script/../t" created "/home/test/HelloC/script/../lib/HelloC/Controller/Foo/Bar.pm" created "/home/test/HelloC/script/../t/controller_Foo-Bar.t"
このコントローラの実体は「HelloC/lib/HelloC/Controller/Foo/Bar.pm」として作成されます。この「Bar.pm」に「hello」アクションを追加します。
package HelloC::Controller::Foo::Bar;
# 省略
sub hello :Local {
my ( $self, $c ) = @_;
$c->response->body( 'hello in Foo::Bar' );
}
このhelloアクションは次のURLにマッチします。
http://<ホスト名またはIPアドレス><:Port>/foo/bar/hello
次に、「HelloC/lib/HelloC/Controller/Root.pm」にも同じhelloアクションを定義してみましょう。
package HelloC::Controller::Root;
# 省略
# ネームスペースを空文字列として設定
__PACKAGE__->config->{namespace} = '';
# 省略
sub hello :Local {
my ( $self, $c ) = @_;
$c->response->body( 'hello in Root' );
}
「__PACKAGE__->config->{namespace} = '';」により、Rootコントローラのネームスペースは空文字列として設定されているので、こちらのhelloアクションは次のURLにマッチします。
http://<ホスト名またはIPアドレス><:Port>/hello
トップレベル(:Global)
コントローラのネームスペースに関係なく、トップレベルにマッチするパスを構成するには「:Global」を指定します。「Bar.pm」に「top」アクションを追加してみましょう。
package HelloC::Controller::Foo::Bar;
# 省略
sub top :Global {
my ( $self, $c ) = @_;
$c->response->body( 'top in Foo::Bar' );
}
このtopアクションは次のURLにマッチします。
http://<ホスト名またはIPアドレス><:Port>/top
これは、「Root.pm」に:Localアクションとして定義した場合と同じURLになります。
リテラル(:Path)
ネームスペースに関係ない、具体的なURLをアクションにマッチさせるパスを構成するには「:Path」を使用します。
:Pathアトリビュートには引数としてURLとなる文字列を指定できます。引数として指定するURL文字列の先頭にスラッシュ「/」がつくと絶対パスに、スラッシュがつかない場合には相対パスとしてアクションへのマッピングが行われます。
まずは相対パスの例を見ていきましょう。「Bar.pm」に「rel_path」というアクションを定義します。ここで:Pathアトリビュートの引数に「one/two」を指定すると、先頭にスラッシュがついていないことから、ネームスペースURLへの相対パスになります。
package HelloC::Controller::Foo::Bar;
# 省略
sub rel_path :Path('one/two') {
my ( $self, $c ) = @_;
$c->response->body( 'relative path in Foo::Bar' );
}
このアクションにマッチするURLは次のようになります。
http://<ホスト名またはIPアドレス><:Port>/foo/bar/one/two
同様に、「abs_path」というアクションを定義します。ここでは:Pathアトリビュートの引数には「/one/two」を指定します。先頭にスラッシュがついているのでベースに直接結びつくURLとして定義されることになります。
package HelloC::Controller::Foo::Bar;
# 省略
sub abs_path :Path('/one/two') {
my ( $self, $c ) = @_;
$c->response->body( 'absolute path in Foo::Bar' );
}
このアクションにマッチするURLは次のようになります。
http://<ホスト名またはIPアドレス><:Port>/one/two
コントローラを作成したときに最初から生成される「index」アクションでは、:Pathアトリビュートには引数がついていません。これはコントローラのネームスペースに直接マッピングされるURLを指定したことになります。
package HelloC::Controller::Root;
# 省略
sub index :Path :Args(0) {
my ( $self, $c ) = @_;
# Hello World
$c->response->body( $c->welcome_message );
}
