動くところまで(改訂版)

すみません、私、どうも、大きく間違えていたようです。今までずっとMojolicious::Liteだと思っていたのが、実はMojoliciousだったようです。

いや、誰かに指摘されたとかではなく、例によってこの辺を読んでいたら、なんか書いてあることが上手くいかなくて、でも、まだ正式リリースではないからそういうこともあるのかな、と思っていたのですが・・・。

っていうか、useしているモジュールがMojolicious::LiteじゃなくてMojoliciousである時点で気付くべきですよね。どんだけ鈍いんだか・・・。

というわけで、仕切り直しです。

※以下のサイトを参考とさせて頂きました。

このサイトからMojolicious-latest.tar.gzをダウンロードして展開すると、細かいバージョン名がついたフォルダができます。この記事を書いている時点での最新版はバージョン0.999930でした。で、いきなりシェルからコマンドを実行します。

% ./script/mojo generate lite_app myapp

そうです、前回はgenerate appでしたが、これで生成されるファイル群は、Mojolicious::LiteではなくMojoliciousなのです、多分。

まぁ、Mojolicious::LiteはMojoliciousを拡張しているもののようですし、どちらでも好きな方を使えば良いのでしょうけど、MoJoliciousとMojolicious::Liteでは、フレームワークとして利用する際の細かい作法が違ってくるみたいです。どうりで、書いてある通りにやっても上手くいかないわけですよ・・・。

話を戻しまして、generate lite_appコマンドを実行すると、単一のファイルが生成されます。これが、Mojolicious::Liteのサンプルファイルです。

#!/usr/bin/env perl

use Mojolicious::Lite;

get '/' => 'index';

get '/:groovy' => sub {
    my $self = shift;
    $self->render(text => $self->param('groovy'), layout => 'funky');
};

app->start;
__DATA__

@@ index.html.ep
% layout 'funky';
Yea baby!

@@ layouts/funky.html.ep
<!doctype html><html>
    <head><title>Funky!</title></head>
    <body><%== content %></body>
</html>

このままだと、Mojolicious::Liteモジュールをuseできないので、libでインクルードパスを追加します。あと、CGIで動作するようにstartメソッドに引数を渡します。他にもsue strictしたりuse warningsしたりuse utf8したりもします。

結果、以下のようなファイルになりました。

#!/usr/bin/env perl

use strict;
use warnings;
use utf8;

use File::Basename 'dirname';
use File::Spec;

use lib join '/', File::Spec->splitdir(dirname(__FILE__)), 'lib';
use Mojolicious::Lite;

get '/' => 'index';

get '/:groovy' => sub {
    my $self = shift;
    $self->render(text => $self->param('groovy'), layout => 'funky');
};

app->start('cgi');
__DATA__

@@ index.html.ep
% layout 'funky';
Yea baby!

@@ layouts/funky.html.ep
<!doctype html><html>
    <head><title>Funky!</title></head>
    <body><%== content %></body>
</html>

ファイルは位置に関しては、以下のようなものを想定しています。

mojolicious/lib/
mojolicious/myapp
mojolicious/script/
mojolicious/t/

さて、早速コイツを実行してみましょう。またまた.htaccessファイルを作成して、実行できるようにしてみます。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /mojolicious
RewriteRule ^$ myapp/ [R=301,L]
</IfModule>

DirectoryIndex myapp
<FilesMatch "^myapp$">
SetHandler cgi-script
</FilesMatch>

.htaccessファイルに関しては、前回と方針を変えています。

まず、mojoliciousを格納しているディレクトリへアクセスされた際に、myapp/へリダイレクトさせています。これにより、常にmojolicious/myapp/へのアクセスになるようにしました。無理矢理ですかね?

次に、ディレクトリへのアクセスの際にデフォルトで表示されるファイルにmyappを指定し、さらにmyappをCGIスクリプトとして実行できるように設定しました。

これにより、mojolicious/myapp/へアクセスすればMojolicious::Liteが動くという寸法です。実際にアクセスしてみれば、“Yea baby!”と表示されるはずですよ。

この一枚もののファイルを編集することで色々とできるようなのですが、その辺はまた今度ということにします。