のらねこの気まま暮らし

技術系だけど、Qiita向きではないポエムとかを書くめったに更新されないヤツ

mojoを使った話

すでに二日くらい経過しているので、何を書こうと思っていたか忘れてしまった。

ちょっと待ってくれ。今思い出す。

・・・

そう、Mojolicious::LiteはperlのWAFなんだけれど、日本語のドキュメントが整っていたり、Google先生に聞けばたいていの問題は解決する。なので、特に書くことが無いんだ。

とはいえ、念のため自分メモを作る。
こういう振り返りは今後のためになると信じている。

Mojolicious::Liteで作る

morbo
開発サーバ
log
デバグログ置き場
public
静的ファイル置き場
templates
テンプレートを分けた場合の置き場

開発サーバ morbo

なんて読むんだろう?
ファイルが変更されると自動でリスタートをしてくれる。

    • verbose を設定すると、ファイル変更のリスタートやsyntax errorなどを吐いてくれる。
    • watch を設定すると初期値に加えて指定したディレクトリも監視し、変更したら更新してくれるようになる。試してない。

$ morbo ./app.pl daemon --listen http://127.0.0.1:8080 --verbose

log

ちょっとログの出し方にはまった。
Mojoliciousはmode=developmentの時にデバグログを吐く。デバグなんだからそうですよね。

mojo梱包のサーバを使うなら↓のようにすればよい。

$ ./app.pl -l *:8080 --mode=development

開発サーバとして梱包されているmorboにはmodeの指定の機能が無いようで、どうすればいいかわからない。
とりあえず、↓のようにした

app->log->level('debug');
app->start

これで、./log 以下にdevelopment.logが吐かれるようになる。

public

cssや画像ファイルといった静的ファイルを配置するばしょ。
public/css/style.cssと指定しておけば、/css/style.cssのパスで取得できるのだよ。

templates

特になにもしなければ、mojo::liteは__DATE__セクションからテンプレートの情報を引いてきてくれる。
けれども、ファイルが大きくなりすぎると管理しにくいので、分けたい、そんなときにこのディレクトリを使う。

例えば、"/"にindexのファイルを配置したければ、次のように。
app.pl

use Mojolicious::Lite;

get '/' => sub {
    my $self = shift;
} => 'index';

app->start;

directory

templates
- index.html.ep
app.pl

getメソッドで'/'にアクセスが来たら、index(という名前の付いた).html(ファイル形式の).ep(テンプレート)を探しに行く。__DATA__以下になければ、templates/を見に行く。


気を付けなければならないのは、読み込むべきテンプレートの指定と、拡張子に.html.epを付けなければならないこと。

.htmlはHTMLコンテンツであることを示す。
.epはmojoが扱うテンプレートハンドラーの形式。

Router

mojoのdispatcher。

リクエストメソッドとパスの指定により、ルートを決定する。

get '/' => sub { ... } => 'index';
get 'register' => sub { ... } => 'register';
post 'register' => sub { ... return $self->render_json); };

他にも、pullやheadも使えるかもしれない。

プレースホルダ

/list?page=1 というURLを /list/1 にしたい場合、以下の様にすれば可能。

get '/list/:page' => sub {
    my $self = shift;
    my $page = $self->param('page');
};


また、プレースホルダに初期値を指定したい場合、

get '/list/:page' => {page => 1} => sub {...};

で、/list にアクセスした時に ?page=1 が設定される。
べんりー。

under

認証など各ページ間で共通した処理を記述したい場合に使うもの。

underメソッドを呼び出した移行のルート記述すべてにその設定が適応される。

例えば、
"/"は認証を行わず、"/user"には認証をかけたい場合

# 認証なし
get '/' => sub {...} => 'index';

# これ以降のページは認証
under sub {
   my $self = shift;
   if ($self->is_login) {
      $self->redirect_to(...);
      return;
   }
   return 1;
}

get '/user' => sub {...} => 'index';


また、"/some/add", "/some/list", "/some/edit" などとディレクトリが重なっているのもunderで書ける。

under '/some';
get '/add' => {...};
get '/list' => {...};
get '/edit' => {...};

Controller

Mojolicious::Liteでのルーター(get, post等)で受け取るインスタンスは、Mojolicious::Controller。
$self->renderとかやっているけど、それはControllrメソッドなのです。

僕が主に使いそうなのは以下。

  • param
  • session
  • render

param

Mojolicious::Message::Requestのparamメソッドへのアリアス。だと思っている。
もちろん、$self->req->param も利用可能。取得内容は同じ。

GET/POSTのクエリパラメータへアクセスする。

また、Rooterで指定したパラメータにもこちらでアクセス可能。

session

Cookieによるセッション管理メソッド。
詳しいことは読んでいないが、Plack::Request::Sessionや、HTTP::Sessionなどとはいろいろ違う。
暗号化したセッションデータをクライアントのcookieに格納する。

session_idをcookieに格納し、データ自体はサーバで持つ他のセッション系モジュールとは若干挙動がことなる。

詳しく調べていないので、今後 flashや暗号キーの設定についても調べるべし。

# session set
$self->session(user_id => $id);

# session get
my $user_id = $self->session('user_id');

# session remove
$self->session(user_id => undef);

# session expire
$self->session(expires => 1);

renderer

テンプレートをレンダリングするメソッド

Mojolicious::Rendererが基底クラス。

MIMEタイプを元に、レンダリングを行うらしい。
初期値で指定されているのは、たしか、[json, text, xml]とHTMLだった気がする。

# index.html.epをレンダリング
$self->render('index'); 

#   with param
$self->render(index => %values);

# hashをjsonで
$self->render_json(%hash);