Mojoliciousによる開発の勘所
ここからはMojoliciousを利用したWebアプリケーション開発におけるポイントを解説します。
解説する内容を反映したサンプルコードmojo_
)
MojoliciousとMojolicious::Lite
(2)myapp.
や掲示板アプリケーションは,Mojolicious::Lite
を利用したアプリケーションです。ルーティング,
ですが,Mojolicious::Lite
では荷が重くなってきます。このような場合には通常のMojoliciousアプリケーションとして開発を行うことをお勧めします。
Mojoliciousアプリケーションはmojogenerate
で生成できますが,lite_
ではなくapp
となります。
$ mojo generate app
コマンドが完了すると,my_
ディレクトリ配下に図5のディレクトリ構造が生成されます。各コンポーネントごとにファイルが分割されるので,
プロトタイピングでMojolicious::Liteアプリケーションを作成し,
モデルの実装
前述したとおり,
前節の掲示板アプリケーションの場合は特にほかのインタフェース
リスト9は,Teng
を利用したモデルの実装例です。
リスト9 モデルの実装例
package MyApp::Model;
use Mojo::Base -strict;
use Carp qw/carp croak/;
use Mojo::Loader qw/find_modules load_class/;
use Teng::Schema::Loader;
load_class $_ for find_modules __PACKAGE__;
my $INIT_ARGS;
sub init {
my ($class, %args) = (shift, @_);
if ($INIT_ARGS) {
carp "already initialized";
}
else {
$INIT_ARGS = \%args;
}
return $INIT_ARGS;
}
sub db {
croak "You should init first" unless $INIT_ARGS;
state $db = Teng::Schema::Loader->load(
namespace => 'MyApp::DB',
%$INIT_ARGS,
);
}
1;
このモデルを各インタフェースで直接扱ってもよいのですが,
package MyApp::Model::User;
use Mojo::Base -strict;
sub table_name {'user'}
sub all {
my $class = shift;
MyApp::Model->db->search(
table_name,
{deleted => 0},
{order_by => 'name'},
);
}
...
このように実装することでコントローラからアプリケーションロジックを分離し,
MyApp::Model->init(connect_info => ...);
my $users = MyApp::Model::User->all();