CatalystのURL
CatalystではURLは2つの部分に分けて考えられています。
例えば「http://localhost:3000/foo/bar」というURLの場合だと、「http://localhost:3000/」と「foo/bar」に分けられ、前者をベース、後者をパスと呼びます。ホスト名(とポート番号)の後のスラッシュ「/」はパスではなくベースに含まれます。このパスがどのアクションに結びつけられるかは、アトリビュートとコントローラのネームスペース、そしてメソッド名から決定されます。
ネームスペースは、コントローラモジュールのパッケージ名から先頭の「<MyApp>::Controller::」を取り除き、「::」を「/」に変換し、文字列を小文字に変換したものです。例えば、コントローラのパッケージ名が「HelloWorld::Controller::Foo::Bar」の場合のネームスペースは、「foo/bar」になります。
コントローラの中でも「<MyApp>::Controller::Root」は特別な存在で、ネームスペースは定義されておらず、トップレベルのURL「http://localhost:3000/」にマッピングされます。また、ネームスペースはパッケージ名と関係ない文字列で上書きすることもできます。
アクションの定義
アクションとは特別なアトリビュートを付加したコントローラのメソッドです。
アクションとして定義可能な主要アトリビュートには次のものがあります。
| アトリビュート | 用途 |
| :Local | ネームスペースに従うURLを定義する際に使用する。 |
| :Global | ベースに割り当てられるURLを定義する際に使用する。 |
| :Path | リテラルにマッチするURLを定義する際に使用する。ネームスペースやメソッド名とは関係のないURLを定義できる。 |
| :Regex | グローバルな正規表現にマッチさせるURLを定義する際に使用する。 |
| :LocalRegex | ローカルな正規表現にマッチさせるURLを定義する際に使用する。 |
| :Chained | アクションを連鎖させる場合に使用する。 |
| :Private | URLにマッチしないアクションを定義する際に使用する。他のアクションから呼び出される。 |
以下では、「:Local」アトリビュートを使用した簡単なアクションを定義します。
「catalyst.pl」で自動的に作成されるRootコントローラに「message」という名前のアクションを追加します。Rootコントローラのファイルは、「lib/HelloWorld/Controller/Root.pm」になります。
package HelloWorld::Controller::Root;
# 省略
# (1)アクションの宣言
sub message :Local {
# (2)引数を受け取る
my ( $self, $c ) = @_;
# (3)レスポンスとして返すメッセージを作成
my $msg = 'Message!';
# (4)レスポンスを設定
$c->response->body( $msg );
}
(1)アクションの宣言
アクションの宣言は、メソッド(サブルーチン)として宣言しますが、メソッド名の後にコロン(:)で始まるアトリビュートを付加します。
この例では:Localアトリビュートを設定しています。
(2)引数を受け取る
メソッドの引数から、変数を取り出します。$selfは自分自身、$cは後述するコンテキストオブジェクトになります。
(3)レスポンスとして返すメッセージを作成
クライアントへ返すメッセージを作成します。必要であればモデルを操作するなどの処理もここに記述します。
(4)レスポンスを設定
レスポンスとしてクライアントに返すデータを設定しています。RootコントローラはURLのベースに割り当てられますので、このアクションを呼び出すURLは次のようになります。
http://<ホスト名またはIPアドレス><:Port>/message
組み込みサーバの場合には「http://<ホスト名またはIPアドレス>:3000/message」になります。以降のサンプルでは、すべてRootコントローラに:Localアクションとして作成していきます。
