Mojolicious::Liteのプレースホルダとパラメータ

@nqounetです。

昔作ったMojolicious::Liteのサンプルを発見したので、振り返りながら解説を試みます。

第1回はプレースホルダとパラメータです。

サンプルコード全体

Mojoliciousのバージョンは5.75で確認しています。

ファイル名はなんでも良いですが、ひとまずmyapp.plと考えてください。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#!/usr/bin/env perl
use utf8;
use Mojolicious::Lite;

get '/' => sub { shift->redirect_to('/everything/54?name=hoge'); };

get '/everything/:stuff' => [stuff => qr/\d+/] => {stuff => 23} => sub {
    shift->render('welcome');
};

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

__DATA__
@@ welcome.html.ep
Stuff is <%= $stuff %>.
クエリーnameの値は<%= param 'name' %>」です

解説

Line 1 - 3

1
2
3
#!/usr/bin/env perl
use utf8;
use Mojolicious::Lite;

これらは毎回書くことになります。 use strict;use warnings;は書かなくてもuse Mojolicious::Liteすれば自動的に有効になります。

最近(というか、バージョン3.69以降なので結構経ちます)は「use utf8;」も自動的に有効になります。 いずれにしろ、書いてあっても害はありません。

Line 5

1
get '/' => sub { shift->redirect_to('/everything/54?name=hoge'); };

これは、URLによる処理の振り分けを指定しています。

この場合は、トップページにアクセスすると、その後に書いたコードリファレンスが実行されます。

このスクリプトをmorbo myapp.plで起動している場合、http://localhost:3000にアクセスすれば、/everything/54?name=hogeへリダイレクトします。

リダイレクトは、例えばログインの処理の後にメンバーのページを表示したり、POSTの処理後に元のページへ戻したりするのに使えます。

ちなみに、これは単にアドレスバーに入力するのが面倒だったので書いたものです。

Line 7 - 9

1
2
3
get '/everything/:stuff' => [stuff => qr/\d+/] => {stuff => 23} => sub {
    shift->render('welcome');
};

ここがこのサンプルの肝です。

/everything/:stuff:stuffは、プレースホルダと言って、この部分に含まれた文字はあとで取り出すことができます。

このサンプルでは、:stuffに対して色々と条件をつけています。

配列のリファレンス(今の場合は[stuff => qr/\d+/])を渡すと、有効にする値を指定することができます。指定できる値は正規表現(使えない機能もあります)、または配列のリファレンスで指定することができます。

ハッシュのリファレンス(今の場合は{stuff => 23})を渡すと、初期値を指定することができます。初期値を指定すると、プレースホルダ部分がない場合でもマッチするようになります。

URLのパスで考えると、/everything/98/everything/everything/がマッチします。

/everything/ab/everything/3gはマッチしません。

コードリファレンスの中身ですが、これは後で出てくるwelcome.html.epをテンプレートにしてレンダリングするようになっています。

Line 11 - 12

1
2
app->log->level('error');
app->start;

最初の行は、ログレベルを変更しています。ログレベルにはdebug,info,warn,error,fatalの5段階があり、今のようにerrorを指定するとerrorfatal以外が表示(または記録)されないようになります。

Mojolicious::Liteは、自動的にデバッグしやすい程度にログを出してくれますが、ここではそれを表示しないようにレベルを変更しています。

本文の最後にはapp->start;を書きます。

定義してきたアプリケーションをこの文で起動させます。

Line 14 - 17

1
2
3
4
__DATA__
@@ welcome.html.ep
Stuff is <%= $stuff %>.
クエリーnameの値は<%= param 'name' %>」です

__DATA__以降はテンプレートなどを書くことができます。

@@ welcome.html.epというのは、次に@@が出てくるまでの範囲をwelcome.html.epというファイルとして扱います。

renderで呼び出しされた後、このテンプレート内では、:stuffに入った値が$stuffとして使用できます。

また、paramという命令で、パラメータから値を取得できます。

この場合は、パラメータのnameで取得できる値を直接表示します。

多機能だけど必要なところだけ使えばOK

Mojoliciousを使うと、とても簡単にURLに対応する処理を書くことができます。

皆さんも美味しいところだけをうまく使ってサクッとウェブアプリを作ってみましょう。

2月28日(土)にPerl入学式の第6回としてウェブアプリを作成します。

大阪の講師は私が担当する予定です。

あなたの知らないPerlを一部お見せしますので、是非ご参加ください。

comments powered by Disqus
Hugo で構築されています。
テーマ StackJimmy によって設計されています。