« NONDRINKING | メイン | 本日の体操 »

2005年07月27日

[技術] Catalystで静的ファイルの表示

Catalyst環境で静的(static)なファイルを表示したり、HTMLファイルからリンクしたスタイルシートやJavaScriptファイルがブラウザにロードされるようにする方法の覚書。

Catalystで静的なHTMLファイルを表示させたくて、MyApp/rootにtest.htmlを置いて、ブラウザでhttp://hoge:3000/test.htmlとしても、test.htmlは表示してくれない。

やり方がわからないので検索すると、静的なファイルを表示するときは、Catalyst::Plugin::Staticを使うとらしいことはわかった。しかし、Staticのヘルプを見ても、$c->serve_staticとするとしか書いていない。

そこで、Static.pmを見てみると以下のようになっている。ブラウザがサーバにhttp://hogehoge:3000/test.htmlとリクエストすると、$c->req->pathには、test.htmlが格納されてくるらしい。(Static.pmの全コード


sub serve_static {
my $c = shift;
my $path = $c->config->{root} . '/' . $c->req->path;
return $c->serve_static_file( $path, @_ );
}

ということで、test.htmlがリクエストされたときにこれを受けるメソッドを定義して、その中で、$c->serve_staticをコールしてやればよいということがわかった。例えば、以下のようなメソッドを定義する。

sub test_static : Path('/test.html') {
my ( $self, $c ) = @_;
$c->serve_static;
}

これで、test.htmlのリクエストがあるとメソッド test_static()がデスパッチされ、test_static()の中で、$c->serve_staticをコールすれば、test.htmlの内容がブラウザに返される。

例えば、HTMLファイルにリンクする画像ファイルなどは、メソッドのデスパッチに正規表現を使って以下のようにすればよい。rootディレクトリの下にimagesというディレクトリをつくり、リンクするHTMLファイルでは、<img src="images/hoge.jpg" />としている場合は以下のようなメソッドを定義してやる。


sub images : Regex('images/.+\.[gif|jpg]') {
my ( $self, $c ) = @_;
$c->serve_static;
}

まあ、Static.pmを見てもらえばわかるんですが、要するにデスパッチされたメソッドの中で、該当ファイルを開いて、$c->res->outputしてやる必要があるってことみたい。その一連の作業をStatic.pmがやってくれるってことですね。

投稿者 nekobara : 2005年07月27日 20:17


トラックバック

このエントリーのトラックバックURL:
http://www.ishihara.ne.jp/mt/mt-tb.cgi/450

コメント