Mojoliciousで静的ファイル(html)を読み込ませるための設定法

Mojoliciousを使っていると、動的ファイルではなくて静的ファイルを読み込ませたい時があります。(errorページみたいなやつで)

そこで今回は、Mojolicisouで静的ファイルを扱うための知見がたまってきたので、備忘録がてらまとめておきます。

Mojoliciousはどの様に静的ファイルを読み込むのか?

そもそも、Mojoliciousがどの様に静的ファイルをまとめているかと言うと、/home/publicディレクトリ以下のファイルを読み込む様になっています。

試しにmojo generate app MyAppでサンプルアプリを作ってみると、/myapp/publicの直下にindex.htmlが用意されています。そこで、morbo script/my_appでサーバーを立ち上げてhttp://localhost:3000/index.htmlを開いてみると、index.htmlにアクセスできます。

コードを読んでみると、内部的には@{$self->static->paths}配列に格納したディレクトリを読み込んでいるみたいですね。

参考:https://github.com/mojolicious/mojo/blob/master/lib/Mojolicious.pm#L163

controller内で静的ファイルを読み込ませたい場合

「処理中にエラーが起こった時にerror.htmlを読み込ませたい」と言った場合みたいに、mojoliciousのcontroller内で静的ファイルを読み込ませたいと言う場合があると思います。

その時は、$c->reply->static('index.html');の様に書くことで、/home/public/index.htmlを読み込ませることができます。

package MyApp::Controller::Example;
use Mojo::Base 'Mojolicious::Controller';

sub welcome {
    my $c = shift;
    .
    .
    unless($user) {
    $c->reply->static('index.html');
    }
}

1;

例えば、データベース上に欲しいデータがなかった場合に静的ファイルを読み込ませる、の様な使い方ができますね。

静的ファイルのディレクトリを変えたい時

そもそも静的ファイルのディレクトリを変えたい場合は、lib/MyApp.pm内のstartup関数に以下のコードを追加すればOKです。

# lib/MyApp.pm

sub startup {
  my $home = $app->home;
  $app->static->paths( [$home .  '/public/src'] );
}

これでpublic/src以下の静的ファイルを読み込むようになります。

ちなみに、my $home = $app->home;とすることでアプリケーションのホームディレクトリを呼び出すことができます。(具体的には、/Users/username/myapp/script/..のようなディレクトリが得られます)

また、複数の静的ファイルディレクトリを用意したい場合は、以下のようにすればOKです。

my $home = $app->home;
push @{$app->static->paths},  $home . '/public/src';

これでpublicディレクトリとpublic/srcディレクトリを読み込んで静的ファイルを出力するようになります。

公式ドキュメントでは、以下のようにしてあげれば静的ファイル読み込みのディレクトリを増やせるよ、と書いてありますが、ドキュメントの通りにディレクトリ名を'/home/sri/public'などのように書いても上手くいきません。

この辺は、少し説明が不親切かなと言う印象は受けました。

# Add another "public" directory
push @{$static->paths}, '/home/sri/public';

# Add another "public" directory with higher precedence
unshift @{$static->paths}, '/home/sri/themes/blue/public';

参考:Mojolicious::Static · yuki-kimoto/mojolicious-guides-japanese Wiki