stash
stash(※注2)は、1回のリクエストついてコンポーネントの間でやりとりするデータを保存するために使われます。stashは自動的にビューに送られ、リクエストの終わりとともに破棄されるため、データを永続化する用途には使うことはできません。
stashへは、「$c->stash」のようにコンテキストからアクセスできます。
英語のstashには「隠し場所」という意味があります。
stashのサンプルでは、先ほどインストールした「Catalyst::View::TT」を使用します。
まず、次のようにヘルパスクリプトを使用してビューを作成します。
$ ./HelloWorld/script/helloworld_create.pl view TT TT
exists "/home/test/HelloWorld/script/../lib/HelloWorld/View" exists "/home/test/HelloWorld/script/../t" created "/home/test/HelloWorld/script/../lib/HelloWorld/View/TT.pm" created "/home/test/HelloWorld/script/../t/view_TT.t"
「Root.pm」に「hello」アクションを定義します。
sub hello :Local {
my ( $self, $c ) = @_;
# (1)言語ごとのメッセージ
my %msgs = (
ja => "こんにちは!",
en => "Hello!"
);
# (2)Accept-Languageの値から言語名を配列に変換
my @langs = split(/,/, $c->request->header('Accept-Language'));
# (3)テンプレートを設定
$c->stash->{template} = 'hello.tt';
# (4)表示するメッセージを設定
$c->stash->{message} = $msgs{$langs[0]} || $msgs{en};
}
このアクションでは次の処理を行っています。
(1)言語ごとのメッセージ
ハッシュに言語コードに対応したメッセージを登録しています。ここでは、日本語(ja)と英語(en)のメッセージを登録しています。
(2)Accept-Languageの値から言語名を配列に変換
Webブラウザのリクエストヘッダにある「Accept-Language」には、レスポンスとして要求する言語などがコンマ区切りの文字列として送られてきますので、これを配列に変換しています。
(3)テンプレートを設定
Template Toolkit形式のテンプレートファイルをstashに登録します。ここで登録したテンプレートファイルを使用して、レスポンスを作成します。
(4)表示するメッセージを設定
先頭の言語タグに対応するメッセージが$msgsに存在すればその値を、存在しなければ「en」のメッセージをstashに登録します。
Catalyst::View::TTのデフォルトの設定では、テンプレートファイルの配置場所とファイル名は次のようなルールに従っています。
| 設定対象 | デフォルト値 |
| 配置場所 | 「root」ディレクトリ |
| テンプレートファイル名 | 「アクション名」+「.tt」 |
このルールに従ってテンプレートファイルを作成すれば、アクションで明示的にテンプレートファイルを指示しなくても、Catalyst::View::TTの側で対象となるテンプレートファイルを解決します。もちろんこれらの設定値は変更可能になっていますが、詳細は後の回で詳しく説明する予定です。
このルールに従って、「hello」アクションのテンプレートファイルを「root」ディレクトリ以下に「hello.tt」という名前で作成します。
Template Toolkitの記載方法
Template Toolkitのタグは[% ~ %]となっているので、このタグを使用してコンテキストから受け取った情報を埋め込みます。
<html> <head><title>[% c.config.name %]</title></head> <body> <p>[% c.stash.message %]</p> </body> </html>
(1)[% c.config.name %]
「c」はコンテキストを表し、所属するオブジェクトへのアクセスはドットで区切って指定します。これは「$c->config->{name}」と同じ意味です。
(2)[% c.stash.message %]
「hello」アクションでstashに登録された「message」を埋め込みます。Catalyst::View::TTの詳しい使い方などについては、Catalyst::View::TTを参照ください。
組み込みサーバを起動し、Webブラウザから「http://<ホスト名またはIPアドレス>:3000/hello」にアクセスすると、使用したWebブラウザの言語情報によって表示されている文字列がいろいろと変わっている様子が確認できると思います。
Firefox3.5で言語情報の設定を行うには次の手順で行います。メニューから[ツール]-[オプション]を選択し、「オプション」画面を開きます。
ここで「言語設定」ボタンを押下すると「Webページの言語」設定画面が開きますので、ここで言語の追加や削除、優先順位の変更を行うことができます。

まとめ
本記事では、Catalystでの処理の流れや主要なコンポーネントについて説明しました。次回では、コントローラに焦点を当てて、コントローラのURLパスとアクションの定義方法などについて説明していく予定です。
参考文献
- 『Catalyst-Manual-5.8000』
- 『モダンPerl入門』 牧大輔 著、翔泳社、2009年2月

