hollyさんのwiki

今時なフレームワーク。仕事で使うことにした使ったので、基本的な使い方やknow-howをまとめておく

install

perlbrew/local::libはインストールされている前提
mkdir /path/to/mojolicious-project
# 永続的に設定しておきたいのであれば、先に以下も実施
perl -Mlocal::lib=/path/to/mojolicious-project >> ~/.bash_profile

eval `perl -Mlocal::lib=/path/to/mojolicious-project`
cpanm Mojolicous

lite_app

まずはMojolicious::Liteなアプリケーションから作成する
mojo generate lite_app myapp
 [exist] /home/holly/sandbox/mojolicious-project
  [write] /home/holly/sandbox/mojolicious-project/myapp
  [chmod] myapp 744
myappという実行ファイルが生成される。中身は以下
#!/usr/bin/env perl
use Mojolicious::Lite;

# Documentation browser under "/perldoc"
plugin 'PODRenderer';

get '/welcome' => sub {
  my $self = shift;
  $self->render('index');
};

app->start;
__DATA__

@@ index.html.ep
% layout 'default';
% title 'Welcome';
Welcome to Mojolicious!

@@ layouts/default.html.ep
<!DOCTYPE html>
<html>
  <head><title><%= title %></title></head>
  <body><%= content %></body>
</html>

起動

とりあえずアクセスできるようにするにはmorboを実行する。3000portでappサーバが起動する
morbo myapp
curlとかでアクセス可能
curl -L http://localhost:3000/welcome

inflate

ある程度規模が大きくなると1ファイルだと厳しくなってくるので、テンプレート類を外だしにする
./myapp inflate
  [mkdir] /home/holly/locallib-sandbox/plack-and-mojo-app/templates/layouts
  [write] /home/holly/locallib-sandbox/plack-and-mojo-app/templates/layouts/default.html.ep
  [exist] /home/holly/locallib-sandbox/plack-and-mojo-app/templates
  [write] /home/holly/locallib-sandbox/plack-and-mojo-app/templates/index.html.ep

app

中規模以上になるならはじめからこっちにしておくほうがよい
# camelcaseで作成すること
mojo generate app MyApp
  [mkdir] /home/holly/locallib-sandbox/plack-and-mojo-app/my_app/script
  [write] /home/holly/locallib-sandbox/plack-and-mojo-app/my_app/script/my_app
  [chmod] my_app/script/my_app 744
  [mkdir] /home/holly/locallib-sandbox/plack-and-mojo-app/my_app/lib
  [write] /home/holly/locallib-sandbox/plack-and-mojo-app/my_app/lib/MyApp.pm
  [mkdir] /home/holly/locallib-sandbox/plack-and-mojo-app/my_app/lib/MyApp
  [write] /home/holly/locallib-sandbox/plack-and-mojo-app/my_app/lib/MyApp/Example.pm
  [mkdir] /home/holly/locallib-sandbox/plack-and-mojo-app/my_app/t
  [write] /home/holly/locallib-sandbox/plack-and-mojo-app/my_app/t/basic.t
  [mkdir] /home/holly/locallib-sandbox/plack-and-mojo-app/my_app/log
  [mkdir] /home/holly/locallib-sandbox/plack-and-mojo-app/my_app/public
  [write] /home/holly/locallib-sandbox/plack-and-mojo-app/my_app/public/index.html
  [mkdir] /home/holly/locallib-sandbox/plack-and-mojo-app/my_app/templates/layouts
  [write] /home/holly/locallib-sandbox/plack-and-mojo-app/my_app/templates/layouts/default.html.ep
  [mkdir] /home/holly/locallib-sandbox/plack-and-mojo-app/my_app/templates/example
  [write] /home/holly/locallib-sandbox/plack-and-mojo-app/my_app/templates/example/welcome.html.ep
ディレクトリ構造をみて大体わかると思うけど、こういう感じになる。lite_appと違い$MOJO_HOMEに移動したほうが作業しやすい

起動

同じ
morbo script/myapp

controllerとroute

$AppName::$RouteNameのcontrollerを作るとURLもhttp://$domain/$RouteNameとなるが(自分でそういうふうにrouteの処理をもちろん書くんだけど)、lib以下を↓のようにする
cd lib/MyApp
# ModelとかPluginディレクトリとかも作りたくなってくるはずなのでついでにつくる
mkdir Controller Plugin Model
# いらない
rm Example.pm

MyApp/Controller/Default.pmを作る
package MyApp::Controller::Default;
use Mojo::Base 'Mojolicious::Controller';
use utf8;

# This action will render a template
sub index {
  my $self = shift;

  # Render template "example/welcome.html.ep" with message
  $self->render(
    message => 'Welcome to the Mojolicious real-time web framework!');
}

1;

viewもかえる
cd $MOJO_HOME
mv templates/example templates/default
mv templates/default/welcome.html.ep templates/default/index.html.ep

最後にbaseモジュールも変更
package MyApp;
use Mojo::Base 'Mojolicious';

# This method will run once at server start
sub startup {
  my $self = shift;

  # Documentation browser under "/perldoc"
  $self->plugin('PODRenderer');

  # Router
  my $r = $self->routes;

  # set controller
  $r = $r->namespace("MyApp::Controller");

  # Normal route to controller
  $r->get('/')->to('default#index');
}

1;

環境変数

重要そうなの
変数意味
MOJO_HOMEhomedir. 設定していない場合、lite_appは実行ファイルが置かれているディレクトリ、appは作成されたディレクトリがデフォルトとなる
MOJO_REVERSE_PROXYとりあえず1にしておいたほうがよい。1にするとredirect_toを絶対URLで正しく指定することができる。X-Forwarded-For, X-Forwarded-Host, X-Forwarded-HTTPSを検出することを可能になる
MOJO_MODEアプリケーションモード。設定していない場合、morboだとdevelopment, hypnotoadだと自動的にproductionとなる
MOJO_NO_IPV6不要なら1にしておくほうがよい
MOJO_NO_TLS不要なら1にしておくほうがよい

plugin

そもそもの使い方

この場合はMojolicious::Plugin::PODRendererがloadされる
# appの場合はstartupの中で$self->plugin("PODRenderer");
plugin "PODRenderer";

この場合はMyApp::Plugin::SamplePluginがloadされる
plugin "MyApp::Plugin::SamplePlugin";

アプリケーションのnamespaceにあわせたようなpluginにするけど、名前が長いのがめんどくさい場合は以下でもok。指定したprefixは不要となる
push(@{$self->plugins->namespaces}, __PACKAGE__ . "::Plugin")

PODRenderer

アプリ作成時に自動で有効になっている。http://x.x.x.x/perldoc/ でMojoliciousのperldocがみれる。http://x.x.x.x/perldoc/LWP/UserAgent でアクセスするとLWP::UserAgentのpodがみれる。少なくとも本番では不要

Config

${app}.confを作成しておくと自動的に読み込んでくれる。${app}.${mode}.confがあるとoverrideを自動でしてくれる。DBの設定など、development/productionごとに違う場合はそれぞれのmodeの設定ファイルを作成して、違う値を設定しておけばよい。以下のようにしてアクセスすることできる
$self->config->{"foo"};

Charset

ローカライズ。Accept-Languageからデフォルトの言語設定をしている。明示的に指定することも可能
plugin 'Charset', { default => "en" };
詳細はlocalizeを参照
多言語対応する場合はいる

plack

production環境の場合はhypnotoadを使えばokだが、plackを使うのもあり。それはそれでいろいろと恩恵を受けることができるはず。

plackupは拡張子がないファイルは.pmとして扱うようなので、mojoコマンドでアプリケーション作成後、lite_appの場合はsymlinkをはる
(cd /path/to;  ln -s myapp myapp.pl)

psgiを作成

lite_app
#!/usr/bin/env perl
use Mojolicious::Lite;
use Plack::Builder;

# Documentation browser under "/perldoc"
plugin 'PODRenderer';

get '/' => sub {
  my $self = shift;
  $self->render('index');
};

builder {
  app->start;
};
__DATA__

@@ index.html.ep
% layout 'default';
% title 'Welcome';
Welcome to the Mojolicious real-time web framework!

@@ layouts/default.html.ep
<!DOCTYPE html>
<html>
  <head><title><%= title %></title></head>
  <body><%= content %></body>
</html>

app

いろいろ調べたところこれでいけそう
#!/usr/bin/env perl

use strict;
use warnings;
use Mojo::Server::PSGI;
use Plack::Builder;
use FindBin;
use lib "$FindBin::Bin/../lib";
use MyApp;

my $server = Mojo::Server::PSGI->new( app => MyApp->new );
my $app = sub { $server->run(@_) };

builder {
        $app;
};
他には みたいな書き方もあるようだ。試してないけど

session

標準でもちろん使うことが可能
※Plack::Session使用例を書くこと

その他

たんなる情報の寄せ集めに過ぎないが

assets pipeline

https://gist.github.com/3927875 にあった。標準機能にあればいいのに
タグ

Wiki内検索

Menu

ここは自由に編集できるエリアです。

管理人/副管理人のみ編集できます