ダウンロード サンプルファイル (51.0 KB)
アクションの種類
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 );
}
この記事は参考になりましたか?
- Webアプリケーションフレームワーク「Catalyst」入門連載記事一覧
- この記事の著者
-
山田 祥寛(ヤマダ ヨシヒロ)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
-
WINGSプロジェクト 花田 善仁(ハナダ ヨシヒト)
<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書、記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
