TOPシステム開発> コントローラークラス
まるごとPerl!
使ってわかるCatalyst

第3回:コントローラクラスへの理解を深める
著者:アドウェイズ  加藤 敦   2006/9/13
1   2  次のページ
コントローラークラス

   ディレクトリ構造の次に、コントローラークラスについて理解を深めていきたいと思います。最初に説明した「URIベースの振舞」がコントローラークラスに深い関係があるので、そこから説明します。

パスとコントローラークラスの関係

   URIベースの振舞というのは、簡単にいえばパス(環境変数のPATH_INFOの値)によるディスパッチ(分岐)です。Catalystでは、パスにより、どのクラスのどのメソッドを呼ぶかが決まります(表2)。

パス クラス メソッド アトリビュート
/ Application::Contoroller::Root index Private
/foo Application::Contoroller::Root foo Local
/* Application::Contoroller::Root default Private
/bar/ Application::Contoroller::Bar index Private
/bar/foo Application::Contoroller::Bar foo Local
/bar/* Application::Contoroller::Bar default Private
/bar/buz/ Application::Contoroller::Bar::Buz index Private
/bar/buz/foo Application::Contoroller::Bar::Buz foo Local
/bar/buz/* Application::Contoroller::Bar::Buz default Private

表2:パスとメソッドの対応

   Rootクラスはルートパスのメソッドを担当するもので、これだけ少し特殊です。その他はパスとクラス/メソッド名のつながりが直感的にわかると思います。

   ですが…見慣れないものがありますね。「アトリビュート」です。表2のメソッドは全てアトリビュート付きで定義されます。

sub index : Private { }

   というように、サブルーチン名の横に付いた「: 文字列」をアトリビュートといいます。アトリビュート自体の説明は、perldoc attributesやperldoc perlsubが詳しいのでここでは省略して、Catalystにおけるその役割と種類について説明します。


Localアトリビュート

   アクセスされたパスからクラス名を除いた残りがメソッド名として、Localアトリビュート付きで定義されていれば、そのメソッドが呼ばれます。ちょっとわかりづらいので整理しましょう。次のケースを考えてみます。

  • パス:/bar/foo
  • クラス:Bar
  • メソッド:foo

   fooメソッドがLocalアトリビュート付きで定義されていれば、/bar/fooにアクセスしたときに、このメソッドが呼ばれます。なお、Catalystではコントローラーに定義されたメソッドを「アクション」と呼びます。

   では、fooアクションがLocalアトリビュート付きで定義されていない、もしくは、そもそも存在しない場合はどうなるでしょうか?表2にあるように、Privateアトリビュートのdefaultが呼ばれます。


Privateアトリビュート

   Privateアトリビュートは、内部的に使われるアクションや、Catalystで予約している動きをするアクションに付けます。

   前者の動作を見ると、例えばRoot.pmに、

sub hogehoge : Private { }

   と定義し、ブラウザーで/hogehogeにアクセスしても、このアクションは呼ばれません。

   後者の例は、表2のdefaultとindexが相当します。defaultはアクションが見付からない時に呼ばれ、indexはパスがクラス名で終わっている時に呼ばれます。indexがない場合はdefaultが呼ばれます。Bar::Buzクラスにdefaultがない場合は、Barクラスのdefaultが呼ばれます。パスに対応するクラスにアクションが見付からない時には、クラスを遡ってdefaultが呼ばれます。


Globalアトリビュート

   Localとは違い、Globalアトリビュートをつけると、クラス名とパスの対応が無視され、ルートパスのアクションとして定義されます。

   リスト5のように定義した場合、対応するパスは、/bar/buz/hogehogeではなく/hogehogeになります。

リスト5:Globalアトリビュートの例
package Bookmark::Controller::Bar::Buz;

sub hogehoge : Global { }

1   2  次のページ

株式会社アドウェイズ 加藤 敦
著者プロフィール
株式会社アドウェイズ   加藤 敦
アフィリエイトシステムやモバイルサイトの構築などを経て、現在、技術マネージャーとして新規サービスの設計、システムの標準化などに携わる。個人的にCPANモジュールの開発や、オープンソースのプロジェクトに参加している。


INDEX
第3回:コントローラクラスへの理解を深める
コントローラークラス
  Path(/path)アトリビュート