SHOEISHA iD

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

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

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

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

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

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

フロー制御メソッドの具体例

 今回もサンプルアプリケーションで実際のコードを確認しながら説明していきます。この例ではFCSampleという名前で作成します。

[リスト4]FCSampleアプリケーションのスケルトンを作成する
$ catalyst.pl FCSample

 また、サンプルではビューを使用するので、「<MyApp>_create.pl」を使用してビューを作成しておきます。ヘルパスクリプトに渡すパラメータは次のようになります。

[リスト5]ビューを作成するパラメータ
$ <MyApp>_create.pl view 作成するビューモジュール名 使用するヘルパモジュール名

 今回のサンプルではビューモジュールとしてCatalyst::View::TTを使用するので、次のようにパラメータを指定してヘルパスクリプトを実行します。

[リスト6]ビューを作成する
$ ./FCSample/script/fcsample_create.pl view TT TT

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

forwardとdetachを使用したサンプル

 forwarddetachを使用した例として、リクエストパラメータをチェックし、値が設定されていなければエラーメッセージを表示し、設定されていればOKを表示するアクションを紹介します。

 forwardメソッドでアクションを呼び出した場合には、戻り値を受け取ることができるため、リクエストパラメータをチェックするアクションはforwardメソッドで呼び出しています。

[リスト7]searchアクション
package FCSample::Controller::Root;

# 省略

sub search :Local {
  my ( $self, $c ) = @_;
  # (1)パラメータチェック。結果がエラーの場合にはdetachでempty_errorを実行
  $c->detach('empty_error')
    unless $c->forward('check_param');
  # (2)パラメータチェックの結果がOKの場合
  $c->response->body( 'OK' );
}
# (3)パラメータチェックを行うアクション
sub check_param :Private {
  my ( $self, $c ) = @_;
  return 0 unless ($c->req->parameters->{q});
  return 1;
}
# (4)値が設定されていない場合に呼び出されるアクション
sub empty_error :Private {
  my ( $self, $c ) = @_;
  $c->response->body( 'Empty!' );
}

 searchアクションが呼び出されると、まず最初に(1)の箇所でパラメータチェックを行うために、forwardメソッドでcheck_paramアクションを呼び出します。この結果が1ではない場合にはdetachメソッドでempty_errorアクションを呼び出します。結果が1の場合には、(2)のようにレスポンスとして「OK」という文字列を返します。

 check_paramアクション(3)では、リクエストパラメータをチェックし、値が設定されていない場合には0を、そうでない場合には1を返します。値が設定されていない場合には、empty_errorアクション(4)が呼び出されますが、ここでは「Empty!」という文字列をレスポンスとして返しています。

 リクエストパラメータを指定したURLと指定しないURLをブラウザで表示させた結果は、それぞれ次のようになります。

http://<ホスト名またはIPアドレス><:Port>/search?q=Catalyst
リクエストパラメータを指定したURLを表示した画面
リクエストパラメータを指定したURLを表示した画面
http://<ホスト名またはIPアドレス><:Port>/search
リクエストパラメータを指定しないURLを表示した画面
リクエストパラメータを指定しないURLを表示した画面
visitとgoを使用したサンプル

 次にvisitgoを使用した例を紹介します。先ほどのforwarddetachの例とほぼ同じ動作をしますが、レスポンス作成にはCatalyst::View::TTテンプレートを使用しています。

[リスト8]viewアクション
package FCSample::Controller::Root;

# 省略

sub view :Local {
  my ( $self, $c ) = @_;
  # (1)パラメータチェック。結果がエラーの場合にはgoでempty_error_viewを実行
  $c->go('empty_error_view')
    unless $c->forward('check_param');
  # (2)パラメータチェックの結果がOKの場合
  $c->visit('query_view');
}
# (3)リクエストパラメータを表示するアクション
sub query_view :Private {
  my ( $self, $c ) = @_;
  $c->stash->{query} = $c->req->parameters->{q};
}
# (4)値が設定されていない場合に呼び出されるアクション
sub empty_error_view :Private {
  my ( $self, $c ) = @_;
}

 viewアクションが呼び出されると、まず最初に(1)の箇所でパラメータチェックアクションを呼び出し、その結果が1ではない場合にはgoメソッドでempty_error_viewアクションを呼び出します。

 結果が1の場合には、正常なレスポンスを返すために、(2)のようにvisitメソッドでquery_viewアクションを呼び出します。

 リクエストパラメータが設定されている場合に呼び出されるquery_viewアクション(3)では、渡されたパラメータの値をStashに登録します。

 値が設定されていない場合に呼び出されるempty_error_viewアクション(4)では、エラー表示に必要な処理を行います。

 またquery_view、empty_error_viewアクションでは、visitgoメソッドから呼び出されるため、明示的にテンプレートファイル名を指定する必要がありません。

 query_viewempty_error_viewアクション用のテンプレートファイルを「FCSample/root」ディレクトリ以下に、呼び出し先アクションのメソッド名から「query_view.tt」、「empty_error_view.tt」として作成します。

[リスト9]query_view.tt
<h1>リクエスト情報</h1>
<p>リクエストパラメータ:[% query %]</p>
[リスト10]empty_error_view.tt
<h1>値が設定されていません</h1>

 リクエストパラメータを指定したURLと指定しないURLをブラウザで表示させた結果は、それぞれ次のようになります。

http://<ホスト名またはIPアドレス><:Port>/view?q=Catalyst
リクエストパラメータを指定したURLを表示した画面
リクエストパラメータを指定したURLを表示した画面
http://<ホスト名またはIPアドレス><:Port>/view
リクエストパラメータを指定しないURLを表示した画面
リクエストパラメータを指定しないURLを表示した画面

次のページ
リダイレクト

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

  • 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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー

アクセスランキング

アクセスランキング