フロー制御メソッドの具体例
今回もサンプルアプリケーションで実際のコードを確認しながら説明していきます。この例では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