リクエストパラメータを扱うサンプル
例として、2つのパラメータを取得するアクションを紹介します。
このサンプルではCatalyst::Request
の2種類のメソッドを使用してパラメータを取得するために、「query_param
」アクションと「query_parameters
」アクションの2つを定義し、それぞれのアクションを呼び出すためのフォームを表示する「select
」アクションを定義します。それぞれのアクションについては次のような画面を表示するためのテンプレートも併せて作成します。
このサンプルでは「title
」と「cat
」(category)という2つのパラメータを使用します。特に「cat
」パラメータは0個から5個までの複数個が設定されます。またパラメータに日本語の文字列を使用した場合にも正しく受け渡しできていることも確認してください。
パラメータ取得アクションを呼び出すフォーム
まずは、パラメータ取得アクションを呼び出すためのフォーム表示アクションを定義します。このサンプルのように一部の値が異なるだけの場合には、1つのアクションでリクエストパラメータの値によって処理を切り替える場合が多いと思いますが、最近のWebアプリケーションではリクエストパラメータとして情報を受け取るのではなく、URLのパス要素に情報を含めるREST的なURLを選択する事例が増えています。
本記事の前半でURLパスから引数を受け取る方法を紹介しましたので、select
アクションではURLパスで指定される「select
」の後の部分を用いて、query_param/query_parameters
アクションを切り替えて呼び出すことが出来るようにします。
select
アクションは次のようにRoot.pmに定義します。
package ParamSample::Controller::Root; # 省略 # (1)1つだけパス要素を受け取る sub select :Local :Args(1) { # (2)パラメータの種類を引数として受け取る my ( $self, $c, $param_type ) = @_; # (3)パラメータの種類チェック ($param_type eq 'param' || $param_type eq 'parameters') || $c->error('Invalid Request'); # (4)パラメータの種類を設定 $c->stash->{an_action} = ($param_type eq 'param') ? 'query_param' : 'query_parameters'; # (5)テンプレートを指定 $c->stash->{template} = 'select.tt'; }
(1)1つだけパス要素を受け取る
「select
」に続くパス要素を1つだけ受け取るように「:Args(1)
」アトリビュートを指定します。
この指定により、「select/param/abc
」のようにパラメータ種類の後に何らかのパス要素が指定された場合にはselect
アクションにはマッチしません。
(2)パラメータの種類を引数として受け取る
「http://<ホスト名またはIPアドレス><:Port>/select/
パラメータ種類」というURLが呼び出された場合に、「パラメータ種類」の文字列を引数$param_type
として受け取ります。
(3)パラメータの種類チェック
$param_type
の値が「param
」か「parameters
」以外の場合には、処理を中断し、エラーページを表示します。
(4)パラメータの種類を設定
テンプレートでは、パラメータ種類によってPOST
するURLを切り替えますので、Stashにan_action
として、実行するアクションを設定します。
(5)テンプレートを指定
パラメータを取得するアクションを呼び出すためのフォームを定義したテンプレートファイルを指定します。テンプレートファイルは「ParamSample/root/select.tt」として作成します。
select.ttテンプレートは次のようになります。
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>リクエストパラメータ</title> </head> <body> <h1>/[% an_action %]の実行</h1> <form method="POST" action="[% c.uri_for(an_action) %]"> title : <input type="text" name="title"/><br/> <p>category</p> <input type="checkbox" name="cat" value="Perl">Perl</input><br/> <input type="checkbox" name="cat" value="パール">パール</input><br/> <input type="checkbox" name="cat" value="CGI">CGI</input><br/> <input type="checkbox" name="cat" value="Catalyst">Catalyst</input><br/> <input type="checkbox" name="cat" value="カタリスト">カタリスト</input><br/> <input type="submit" name="submit" value="送信"/><br/> </form> </body> </html>
Catalystのuri_for
メソッドは、アクションから対応するURIを返します。
select
アクションで渡されるan_action
には「query_param
」または「query_parameters
」のどちらかが設定されていますので、このuri_forメソッドを使用して、フォームの送信URLに置換しています。
また、「cat
」パラメータはチェックボックスにより複数選択できるようにします。このファイルもUTF-8で保存します。
パラメータ表示テンプレート
パラメータを表示するために「ParamSample/root/query.tt」というテンプレートファイルを作成します。
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>リクエストパラメータの表示</title> </head> <body> <h1>パラメータの値</h1> <p>title=[% title %]</p> <p>category=[% category %]</p> </body> </html>
title
、category
の値をStashから取得して埋め込んでいます。
cat
パラメータは複数設定される場合がありますが、その場合にはカンマ区切りの文字列として連結した値をcategory
に指定するようにします。