SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Webアプリケーションフレームワーク「Catalyst」入門

初めてのCatalyst入門(3)
処理の入り口はアクション

コントローラのURLパスとアクションの定義方法

  • X ポスト
  • このエントリーをはてなブックマークに追加

アクションの種類

 CatalystのアクションとURLパスとの関連づけを行うアトリビュートには次のようなものがあります。以降ではサンプルアプリケーションを使いながら説明します。

アクション定義で使用可能な主要アトリビュート
アトリビュート パスの指定方法
:Local ネームスペース+アクション名
:Global アクション名
:Path リテラルでパスを指定
:LocalRegex ローカルな正規表現でパスを指定
:Regex グローバルな正規表現でパスを指定
:Private 直接パスに割り当てられず、内部で使用
:Args 補助的に引数を制限する場合に使用
:Chained 複数のアクションを連鎖場合に使用

 では、サンプルアプリケーションのスケルトンを作成しましょう。この例では「HelloC」という名前で作成します(「C」はControllerを意味しています)。

[リスト1]「HelloC」アプリケーションのスケルトンを作成する
$ catalyst.pl HelloC

 本記事のサンプルコードは、すべてUTF-8で保存しています。

ネームスペース前置(:Local)

 ネームスペースとメソッド名にマッチするパスを構成するには、「:Local」を指定します。HelloC::Controller::Foo::Barコントローラを例に取ってみましょう。まずHelloC::Controller::Foo::Barを作成するには、次のヘルパスクリプトを実行します。

[リスト2]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」アクションを追加します。

[リスト3]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アクションを定義してみましょう。

[リスト4]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」アクションを追加してみましょう。

[リスト5]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への相対パスになります。

[リスト6]Bar.pmの相対パス定義
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として定義されることになります。

[リスト7]Bar.pmの絶対パス定義
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を指定したことになります。

[リスト8]Root.pmのindexアクション定義
package HelloC::Controller::Root;

# 省略

sub index :Path :Args(0) {
  my ( $self, $c ) = @_;

  # Hello World
  $c->response->body( $c->welcome_message );
}

次のページ
ローカルな正規表現(:LocalRegex)

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
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本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 花田 善仁(ハナダ ヨシヒト)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/4444 2009/10/30 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング