カテゴリー
Mojolicious

Mojoliciousで設定ファイルを読み込んで値を使う時のTips

configファイルの読み込み

設定ファイルを読み込む / Mojoliciousリファレンス - サンプルコードによるPerl入門

 設定(コンフィグ)ファイルを読み込むにはMojolicious::Plugin::Configを利用します。

というように、Mojoliciousアプリで設定ファイルを使う事ができる。例えば etc/MyApp.conf を読み込むには以下のような感じ。 stash_keyはオプションで設定できる(デフォルトはconfig?)

etc/MyApp.conf

{
    # MyApp config
    
    # サービス名
    SARVICE_NAME => 'hogehoge',

    # 配列のリファレンス等
    CATEGORY => [0,1,2,3,4],
}

MyApp.pm

package MyApp;

sub startup {
    my $self = shift;

    # コンフィグファイル読み込み
    my $config = $self->plugin('config', { file => 'etc/MyApp.conf', stash_key => 'conf' });
    ....
}

読み込みはリンク先に詳しく書かれている。

configで設定された値を使う

コントローラーとかで使う

sub index {
    my $self = shift;
    
    #my $config = $self->stash('conf');
    my $config = $self->config;
    my $service_name = $config->{SARVICE_NAME};
    # or 
    my $service_name = $self->config('SARVICE_NAME');
    ....
}

テンプレートで使う

    <%= stash('conf')->{SARVICE_NAME} %>
    <%= config->{SARVICE_NAME} %>
    <%= config('SARVICE_NAME') %>

オブジェクト指向的には config()で取得したほうがいいのかな?

テンプレートで使うには

<%= config 'SARVICE_NAME' %>

がタイプが一番少ないようだ。

カテゴリー
Mojolicious perlモジュール

MojoliciousでDBIx::CustomやDBIx::Connectorを使う時

すぐ忘れるし、どこにあったか分からなくなるのでメモ。

Mojolicious - GitHubより引用

    package MyApp;

    use Mojo::Base 'Mojolicious';

    use DBIx::Custom;

    has dbi => sub {
        my $dbi = DBIx::Custom->connect(...);
        return $dbi;
    };
    
    sub startup {
        my $self = shift;

        ### YOU MUST NOT CALL dbi() method in starup().
    }

リンク先にはBad Exampleもあるので参考に。

カテゴリー
Mojolicious perl perlモジュール

Mojolicious::LiteなアプリケーションをSpeedyCGIで動かす

やっと出来たのでメモ。
起動スクリプト mojo.cgiを

#!/usr/bin/env perl

use strict;
use warnings;
use lib "../lib";
use App;

app->start('cgi');
exit;

こんな感じで呼び出すと通常のCGIとしてならなんの問題もなく実行出来るのだけれど、SpeedyCGIで実行しようとすると初回実行時に不具合が出る(テンプレートが読み込まれない?)上記実行方法でも2回目以降(キャッシュ後)は動作している感じ。

FastCGIやmod_perlでのエントリーは見かけるんだけど、いかんせんマイナーなSpeedyCGI。結構便利なのにあまり使われていないのかなぁ。

で、とりあえず解決方法が見つかったのでメモ。結論から言えば起動スクリプトで Mojo::Server::CGI を使ってアプリを実行すればいいみたい。

ApacheでCGI(SpeedyCGI)としてデプロイする

起動用スクリプトを mojoアプリケーション本体と同じディレクトリに置く。これは必須ではないので公開するときには配置を変えたり出来る。
(例えば App/public/mojo.cgi として App/public を公開ディレクトリにするなど)

__DATA__セクションにテンプレートを書けるけど、ここではテストのため外部ファイル化している。

最小構成

App +
    - App.pm
    - mojo.cgi
    - templates +
                - index.html.ep

スクリプト

起動用スクリプト mojo.cgi

#!/usr/bin/env speedy

use strict;
use warnings;

use Mojo::Server::CGI;
$ENV{MOJO_APP} = 'App';
#$ENV{SCRIPT_NAME} = '';
Mojo::Server::CGI->new->run;
exit;

App.pm と 起動スクリプトが同じディレクトリの場合は use lib; しなくても大丈夫のようだ。別のディレクトリに起動スクリプトを置く場合、例えばApp/public/mojo.cgi とするなら use "../"; が必要になる。

mojoアプリケーション本体 App.pm

package App;

use strict;    # use Mojolicious::Lite;で自動でされるが明示的に
use warnings;  # しておく。
use utf8;
use Mojolicious::Lite;

# テンプレートへ渡すハッシュリファレンス
my $params = {};

# インデックスページ
get '/' => sub {
    my $self = shift;

    $params->{title}="Hello World!";
    $params->{messe} = "ようこそ 世界へ!";
    $self->stash(params => $params);
} => 'index';

# mojo.cgi/任意の文字に対応
get '/:foo' => sub {
    my $self = shift;

    $params->{title}= $self->param('foo');
    $params->{messe} = "このページは" . $self->param('foo') . "です";
    $self->stash(params => $params);
} => 'index';

テンプレートファイル templates/index.html.ep

<!doctype html>
<html>
    <head>
    <title><%= $params->{title} %></title>
    </head>
    <body>
    <h1><%= $params->{messe} %></h1>
    </body>
</html>

上記は最低限のファイル構成だけれど、テンプレートでレイアウト使っても動作していたのでSpeedyCGI化もこの方法なら大丈夫そう。

参考

  • Perl-Mojolicious/ApacheにCGIでデプロイ - yanor.net/wiki
  • Mojoことはじめ - Perl日記
  • Mojoを使ってみた - Charsbar::Note
  • カテゴリー
    Mojolicious perl perlモジュール

    Mojolicious::Liteな perl CGI をレンサバにアップロードするだけで動かす。

    perlのWAF(ウェブアプリケーションフレームワーク)である Mojolicious(Mojolicious::Lite)をアップロードだけで使えるのか試してみる。

    簡単に使えるフレームワークとして、とりあえず Linux+Apacheで動けばおkという前提で。

    なにせフレームワーク初心者の戯事なのでそのあたりは察してください。