Development

ITpro  > Development
Development

簡単実装で学ぶWeb技術

日経ソフトウエア

第4回 Catalyst(前編)---Perl向けWebアプリ・フレームワーク

Hello.pmを読む

 ここでプログラムを読んでみましょう。最初はアプリケーション本体のlib¥Hello.pmです。POD形式*6のマニュアルがすぐに作れるように,たくさんの情報が含まれていますが,プログラム自体は,リスト1に示したものだけです。


リスト1●Helloアプリ本体(lib¥Hello.pm)
リスト1●Helloアプリ本体(lib¥Hello.pm)

Root.pmも読む

 次に,最初から用意されているコントローラlib¥Hello¥Controller¥Root.pmを読みます(リスト2)。


リスト2●最初に用意されているコントローラ(lib¥Hello¥Controller¥Root.pm)
リスト2●最初に用意されているコントローラ(lib¥Hello¥Controller¥Root.pm)

 defaultという関数が用意されていて,その中でウエルカム・メッセージが準備されていることがわかると思います。リスト2の(1)の部分です

 引数$cはコンテキストを表すオブジェクトです(ここでのcは,コントローラではなくcontextの略です)。Catalystのプログラムでは,有用な情報はすべてこの$c経由でやりとりされます。例えば,$c->responseはサーバーからクライアントに返すHTTPレスポンスを表します。メソッド$c->response->bodyを使って文字列を設定すれば,その文字列がコンテンツとして(Webページとして)ブラウザに返されます。

 $c->welcome_messageは最初から用意されているウエルカム・メッセージです。以下のようにRoot.pmを書き換えれば,あなた自身の「Hello!」というメッセージを表示させることもできます。

$c->response->body("Hello!");

 組み込みサーバーを-restartオプションで起動していれば,Root.pmを書き換えたとたん,「File(s) "C:¥work¥Hello¥lib¥Hello¥Controller¥Root.pm" modified, restarting」というメッセージが表示されて,組み込みサーバーは再起動します。

 コンテキスト$c経由では有用な情報がたくさん得られます。例えば,$c->requestを使えば,Webクライアントから来た情報が得られますし,$c->responseを使えば,Webクライアントへ返す情報を設定できます。つまり,原理的にはこれだけでWebアプリは作れます。例えば,HTMLのコードをPerlの文字列でごりごり書いて$c->response->bodyでセットすればよいのです。

 しかし,それではコントローラの中でビューの仕事をしていることになってしまいます。そこで,次にビューを作ってみましょう。

ビューを作る

 ビューは,Webアプリの出力部分を担当します。MVCのVの部分です。ここでは最も典型的なCatalyst::View::TTを使います。これはTemplate::Toolkitというモジュールをビューとして用いるものです。コマンドラインから,以下のように入力します。

script¥hello_create.pl view TT TT

実行の様子を図6に示します。


図6●ビューを作る
図6●ビューを作る

 ここでlib¥Hello¥View¥TT.pmを開いてみると,実質的なコードは何もないことがわかります。実質的なコードは,Catalyst::View::TTのほうにあります。そちらはいじりません。

 ビューを使うために,コントローラに戻ってRoot.pmを修正します(リスト3)。


リスト3●Root.pmに手続きを追加する
リスト3●Root.pmに手続きを追加する

 default関数のほうではテンプレート・ファイルを指定し(1),bodyへの設定をコメントアウトします(2)。

 テンプレート・ファイル名(root.tt)を指定するときに,stashを使っています。stashというのは英語で「隠し場所」という意味です。Catalystでのstashは,汎用のハッシュで,モデル/ビュー/コントローラが互いに情報をやりとりする目的で自由に使うことができます。

 また,Root.pmに対してendという手続きを追加します(3)。実際には,このコードはRoot.pm内にコメントとして用意されているはずです。endという手続きは,セッションが終了するときに呼び出される手続きです。

 end手続きまでに$c->response->bodyに対して何も明示的に文字列が設定されていないときには,forwardメソッドで,TTというビューに仕事を依頼します。ここがちょうど,コントローラがビューに対して「表示に関連した処理」をさせている部分です。ビューは$c->responseに対して表示に関連した処理を行うのですが,コントローラ側であるRoot.pmはそれにはノータッチです。

 この状態で組み込みサーバーを起動し,Webブラウザでアクセスすると図7のようなエラー画面になります。


図7●Helloアプリのエラー画面
図7●Helloアプリのエラー画面 [画像のクリックで拡大表示]

 これはビューが出しているエラー画面で「テンプレート・ファイルroot.ttがない」ことを示しています。しかし,表示されているのはそれだけではなく,

  • $c->requestの内容すべて
  • $c->responseの内容すべて
  • $c->stashの内容すべて

も表示されています。

 つまり,いちいち細かなデバッグ・プリントを用意しなくても,Webアプリの状況をチェックできることになるのです。これはとても便利です*7

 先ほどのエラーを解決するため,リスト4のようなファイルを用意し,Helloアプリの「root」ディレクトリにroot.ttという名前で保存します。


リスト4●root.ttの内容
リスト4●root.ttの内容

 これはTemplate::Toolkitのテンプレート・ファイルで,[% ... %]でくくられたところに,置換する変数名や,IF,WHILE,FOREACHなどの制御文を書くことができます。この書き方は,Template::Toolkitのマニュアルを参照してください。

 ブラウザでHelloにアクセスすると,図9のような表示になります。<h1>...</h1>と<p>...</p>のところがstashの内容に置き換わっているのがわかるでしょう。

サンプル・プログラムのまとめ

 さて,Helloアプリはここまでにします。

 Root.pmはコントローラですから,これを修正することは「制御の流れ」を修正することを意味します。また,テンプレート・ファイルはビューで利用されるファイルですから,root.ttを修正することは,「出力(見栄え)の修正」をしている意味です。

 ここまでで,Catalystを使った最も簡単なアプリの作り方はわかったと思います。次のサンプル・プログラムでは,Model/View/Controllerのうち「モデル」すなわちデータベースも含めたものを作ってみます。

(結城 浩)  [2008/05/20]
出典:日経ソフトウエア2006年9月号  94ページより
(記事は執筆時の情報に基づいており,現在では異なる場合があります)

この記事に対する読者コメント

コメントに関する諸注意 コメント投稿 コメント一覧