フロー制御メソッドの具体例
今回もサンプルアプリケーションで実際のコードを確認しながら説明していきます。この例ではFCSampleという名前で作成します。
$ catalyst.pl FCSample
また、サンプルではビューを使用するので、「<MyApp>_create.pl」を使用してビューを作成しておきます。ヘルパスクリプトに渡すパラメータは次のようになります。
$ <MyApp>_create.pl view 作成するビューモジュール名 使用するヘルパモジュール名
今回のサンプルではビューモジュールとしてCatalyst::View::TTを使用するので、次のようにパラメータを指定してヘルパスクリプトを実行します。
$ ./FCSample/script/fcsample_create.pl view TT TT
本記事のサンプルコードは、すべてUTF-8で保存しています。
forwardとdetachを使用したサンプル
forwardとdetachを使用した例として、リクエストパラメータをチェックし、値が設定されていなければエラーメッセージを表示し、設定されていればOKを表示するアクションを紹介します。
forwardメソッドでアクションを呼び出した場合には、戻り値を受け取ることができるため、リクエストパラメータをチェックするアクションはforwardメソッドで呼び出しています。
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
http://<ホスト名またはIPアドレス><:Port>/search
visitとgoを使用したサンプル
次にvisitとgoを使用した例を紹介します。先ほどのforward/detachの例とほぼ同じ動作をしますが、レスポンス作成にはCatalyst::View::TTテンプレートを使用しています。
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アクションでは、visit/goメソッドから呼び出されるため、明示的にテンプレートファイル名を指定する必要がありません。
query_viewとempty_error_viewアクション用のテンプレートファイルを「FCSample/root」ディレクトリ以下に、呼び出し先アクションのメソッド名から「query_view.tt」、「empty_error_view.tt」として作成します。
<h1>リクエスト情報</h1> <p>リクエストパラメータ:[% query %]</p>
<h1>値が設定されていません</h1>
リクエストパラメータを指定したURLと指定しないURLをブラウザで表示させた結果は、それぞれ次のようになります。
http://<ホスト名またはIPアドレス><:Port>/view?q=Catalyst
http://<ホスト名またはIPアドレス><:Port>/view




