SHOEISHA iD

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

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

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

初めてのCatalyst入門(5)
フロー制御とChainedアクション

アクションから別のアクションを呼び出す

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

Chainedアクションのサンプル

 例として、商品アイテムとそのアイテムに対して登録されたコメントを表示/登録/編集/削除するWebアプリケーションを考えます。これらのアクションを定義するためにFCSample::Controller::Itemコントローラを作成します。

[リスト16]Itemコントローラを作成する
$ ./FCSample/script/fcsample_create.pl controller Item

 この商品アイテムアプリケーションで必要となるパスとして次のものを定義します。/itemの後にはItemIDが、/commentの後にはCommentIDが指定されるものとします。

定義するURLのパス
パス 説明
/item 登録されているアイテムの一覧表示
/item/* 指定されたアイテムの情報を表示
/item/*/comment 指定されたアイテムのコメント一覧を表示
/item/*/comment/add 指定されたアイテムにコメント追加
/item/*/comment/* 指定されたアイテム、コメントを表示
/item/*/comment/*/edit 指定されたアイテム、コメントの編集
/item/*/comment/*/delete 指定されたアイテム、コメントの削除

 これらのパスに対応させるアクションとして、次のものを定義しました。この中でパスと関連づけられていないアクションとしてcapture_itemcapture_commentがあります。これらのアクションで、データの取得、Stashへの登録を行うことで、依存する他のアクションではそれぞれの目的に特化した処理を定義できるようになり、コードの再利用性が高まります。

定義したChainedアクション一覧
アクション名 対応するパス :Chainedの引数 :PathPartの引数 説明
index /item × × Itemコントローラのindexアクションとしてアイテム一覧を表示
capture_item × / 'item' 引数として受け取ったItemIDからアイテム情報を取得
show_item /item/* capture_item '' 指定されたアイテム情報を表示
show_comment_list /item/*/comment capture_item 'comment' 指定されたアイテムのコメント一覧を表示
add_comment /item/*/comment/add capture_item 'comment/add' 指定されたアイテムにコメント追加
capture_comment × capture_item 'comment' 引数として受け取ったItemIDとCommentIDから該当するコメント情報を取得
show_comment /item/*/comment/* capture_comment '' 指定されたコメントを表示
edit_comment /item/*/comment/*/edit capture_comment 'edit' 指定されたコメントの編集
delete_comment /item/*/comment/*/delete capture_comment 'delete' 指定されたコメントの削除

 それでは、上記のアクションのコードを見ていきましょう。

[リスト17]Item.pmの一部
package FCSample::Controller::Item;

# 省略

# (1)モデルからアイテム一覧を取得し、表示する
sub index :Path :Args(0) {
  my ( $self, $c ) = @_;
}
# (2)最上位のChainedアクションとして定義し、ItemIDを引数とする
sub capture_item :Chained('/') :PathPart('item') :CaptureArgs(1) {
  my ( $self, $c, $item_id ) = @_;
  $c->stash->{item_id} = $item_id;
}
# (3)Stashから取得するItemIDを使用してアイテム情報を表示する
sub show_item :Chained('capture_item') :PathPart('') :Args(0) {
  my ( $self, $c ) = @_;
  my $item_id = $c->stash->{item_id};
  ...
}
# (4)複数階層のパスをPathPartに指定
sub add_comment :Chained('capture_item') :PathPart('comment/add') :Args(0) {
  my ( $self, $c ) = @_;
  my $item_id = $c->stash->{item_id};
  if ($c->request->method eq 'POST') {
    # POSTの場合にはパラメータから受け取ったコメントを登録
    $comment = $c->request->parameters->{comment};
    ...
  } else {
    # POST以外の場合にはコメント登録フォームを表示
    ...
  }
  ...
}
# (5)エンドポイントではないアクションを連鎖
sub capture_comment 
      :Chained('capture_item') :PathPart('comment') :CaptureArgs(1) {
  my ( $self, $c, $comment_id ) = @_;
  $c->stash->{comment_id} = $comment_id;
}
(1)モデルからアイテム一覧を取得し、表示する

 indexアクションとして定義し、モデルから取得したアイテム一覧を表示します。

(2)最上位のChainedアクションとして定義し、ItemIDを引数とする

 最上位のChainedアクションとして定義するため、:Chained('/')としています。またこのアクションはエンドポイントではないためCaptureArgsアトリビュートで引数の数を指定しています。ここではItemIDだけを引数として受け取ります。

 この例では、ItemIDをStashに登録していますが、通常はモデルから取得したアイテムデータそのものをStashに登録します。

(3)Stashから取得するItemIDを使用してアイテム情報を表示する

 このアクションは、capture_itemアクションの後に呼び出される必要があるため、:Chained('capture_item')のように指定します。またエンドポイントになるためArgsアトリビュートで引数の数を指定しています。

 必要なアイテム情報はcapture_itemアクションによってStashに登録されているので、ここではアイテムの表示に特化した処理だけを定義できます。

(4)複数階層のパスをPathPartに指定

 PathPartには、ここで指定しているように複数階層のパスを指定することもできます。

 また、Chainedアクションに限った方法ではありませんが、add_commentアクションでは同じURLを指定された場合でも、HTTPのメソッドによって処理を切り替えています。

(5)エンドポイントではないアクションを連鎖

 capture_commentアクションはエンドポイントではありませんが、上位アクションとしてcapture_itemを指定しています。このようにChainedアクションではさまざまなURLに対応できるように、柔軟な定義が可能となっています。

まとめ

 本記事では、アクションからURLを遷移することなく別アクションを呼び出す方法、そしてリダイレクトを行う方法を紹介しました。そして、第3回の記事で簡単に紹介したChainedアクションについてもサンプルを交えて説明しました。

 次回は、Perlでのオブジェクト指向プログラミングについて簡単に説明し、Catalyst5.8から基盤として使用されているMoose、そしてMooseを使用したモダンなCatalystプログラミングなどについて説明していく予定です。

参考資料

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

  • 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 Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook

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

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

この記事をシェア

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

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング