今時なフレームワーク。仕事で使うことにした使ったので、基本的な使い方やknow-howをまとめておく
- https://github.com/yuki-kimoto/mojolicious-guides-... 日本語訳
- http://d.hatena.ne.jp/perlcodesample/20110402/1305... リファレンス的な
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
まずはMojolicious::Liteなアプリケーションから作成する
mojo generate lite_app myapp [exist] /home/holly/sandbox/mojolicious-project [write] /home/holly/sandbox/mojolicious-project/myapp [chmod] myapp 744myappという実行ファイルが生成される。中身は以下
#!/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 myappcurlとかでアクセス可能
curl -L http://localhost:3000/welcome
ある程度規模が大きくなると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
中規模以上になるならはじめからこっちにしておくほうがよい
# 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に移動したほうが作業しやすい
$AppName::$RouteNameのcontrollerを作るとURLもhttp://$domain/$RouteNameとなるが(自分でそういうふうにrouteの処理をもちろん書くんだけど)、lib以下を↓のようにする
MyApp/Controller/Default.pmを作る
viewもかえる
最後にbaseモジュールも変更
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_HOME | homedir. 設定していない場合、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にしておくほうがよい |
そもそもの使い方
この場合はMojolicious::Plugin::PODRendererがloadされる
この場合はMyApp::Plugin::SamplePluginがloadされる
アプリケーションのnamespaceにあわせたようなpluginにするけど、名前が長いのがめんどくさい場合は以下でもok。指定したprefixは不要となる
この場合は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")
アプリ作成時に自動で有効になっている。http://x.x.x.x/perldoc/ でMojoliciousのperldocがみれる。http://x.x.x.x/perldoc/LWP/UserAgent でアクセスするとLWP::UserAgentのpodがみれる。少なくとも本番では不要
${app}.confを作成しておくと自動的に読み込んでくれる。${app}.${mode}.confがあるとoverrideを自動でしてくれる。DBの設定など、development/productionごとに違う場合はそれぞれのmodeの設定ファイルを作成して、違う値を設定しておけばよい。以下のようにしてアクセスすることできる
$self->config->{"foo"};
ローカライズ。Accept-Languageからデフォルトの言語設定をしている。明示的に指定することも可能
plugin 'Charset', { default => "en" };詳細はlocalizeを参照
多言語対応する場合はいる
production環境の場合はhypnotoadを使えばokだが、plackを使うのもあり。それはそれでいろいろと恩恵を受けることができるはず。
plackupは拡張子がないファイルは.pmとして扱うようなので、mojoコマンドでアプリケーション作成後、lite_appの場合はsymlinkをはる
plackupは拡張子がないファイルは.pmとして扱うようなので、mojoコマンドでアプリケーション作成後、lite_appの場合はsymlinkをはる
(cd /path/to; ln -s myapp myapp.pl)
#!/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>
いろいろ調べたところこれでいけそう
#!/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; };他には みたいな書き方もあるようだ。試してないけど
https://gist.github.com/3927875 にあった。標準機能にあればいいのに
タグ
最新コメント