名前

Mojolicious::Static - 静的ファイルを提供

使い方

use Mojolicious::Static;

my $static = Mojolicious::Static->new;
push @{$static->classes}, 'MyApp::Controller::Foo';
push @{$static->paths}, '/home/sri/public';

説明

Mojolicious::Static は、 RFC 7232RFC 7233 に基づく RangeIf-Modified-SinceIf-None-Match をサポートした 静的ファイルへのディスパッチャです。

属性

Mojolicious::Static は以下の属性を実装しています。

classes

my $classes = $static->classes;
$static     = $static->classes(['main']);

Mojo::Loaderを使って、DATA セクションにある静的ファイルを探すためのクラス。 先頭にあるクラスから順に探します。デフォルトは main です。 index.htmlのようにひとつの拡張子が利用されたファイルだけを探します。

# DATA セクションに静的ファイルが記述された別のクラスを追加
push @{$static->classes}, 'Mojolicious::Plugin::Fun';

# DATAセクションにおいて、優先順位の高い静的ファイルのための他のクラスを追加
unshift @{$static->classes}, 'Mojolicious::Plugin::MoreFun';

extra

my $extra = $static->extra;
$static   = $static->extra({'foo/bar.txt' => '/home/sri/myapp/bar.txt'});

ビルトインの例外やノットファウンドページで利用される画像のようなものを "paths"以外の場所からサーブするためのエキストラファイルのパス。 エキストラファイルは、他の代替手段が"paths"と"classes"に見つけられない場合だけ、サーブされることに注意してください。

# ビルトインのファビコンを除く
delete $static->extra->{'favicon.ico'};

paths

my $paths = $static->paths;
$static   = $static->paths(['/home/sri/public']);

静的ファイルを提供するディレクトリ。静的ファイルは、先頭にあるディレクトリから順に探します。

# 別の public ディレクトリを追加
push @{$static->paths}, '/home/sri/public';

# 高い優先順位で、別の public ディレクトリを追加
unshift @{$static->paths}, '/home/sri/themes/blue/public';

メソッド

Mojolicious::StaticMojo::Base から全てのメソッドを 継承しており、以下の新しいメソッドを実装しています。

dispatch

my $bool = $static->dispatch(Mojolicious::Controller->new);

Mojolicious::Controller オブジェクトをディスパッチします。

file

my $asset = $static->file('images/logo.png');
my $asset = $static->file('../lib/MyApp.pm');

ファイルのためのMojo::Asset::FileあるいはMojo::Asset::Memoryオブジェクト。 pathsへの相対か、classesからの相対になります。 見つからなかった場合はundefを返します。 このメソッドは親ディレクトリへのトラバーサルを保護しないので注意してください。

my $content = $static->file('foo/bar.html')->slurp;

is_fresh

my $bool = $static->is_fresh(Mojolicious::Controller->new, {etag => 'abc'});

If-None-MatchIf-Modified-Sinceリクエストヘッダを ETagLast-Modifiedレスポンスと比較して、 新鮮さをチェックします。

以下のオプションが現在では利用可能です。

etag
etag => 'abc'

比較の前にETagヘッダーを追加します。

last_modified
last_modified => $epoch

比較の前にLast-Modifiedヘッダを追加します。

serve

my $bool = $static->serve(Mojolicious::Controller->new, 'images/logo.png');
my $bool = $static->serve(Mojolicious::Controller->new, '../lib/MyApp.pm');

指定したファイルを提供します。pathsclassesへの相対パスです。 このメソッドは親ディレクトリへのトラバーサルを保護しないので注意してください。

serve_asset

$static->serve_asset(Mojolicious::Controller->new, Mojo::Asset::File->new);

RangeIf-Modified-Sinceをサポートした Mojo::Asset::FileあるいはMojo::Asset::Memoryオブジェクトをサーブします。

warmup

$static->warmup;

将来の利用のために"classes"からの静的ファイルを準備します。

参考

Mojolicious, Mojolicious::Guides, http://mojolicio.us.

(Mojolicious 8.12を反映。2019年6月13日更新)