Model in Mojolicious
MojiliciousのModelは自由度があり、開発者にその実装を委ねられていると考えています。 色々調べた結果、私は下記のようにこれを実装することにしました。
まず、lib/Crossin.pmにhelperメソッドを使いどこからでも参照できるようにします。
sub startup {
my $self = shift;
# Helper to define Model
my $m = Crossin::Model->new();
$self->helper(model => sub {$m} );
.....
helper内のsubでnewしませんでした。ModelはFactory的に使っていて、呼び出すたびのインスタンス化を避けたかったからです。
次にlib/Crossin/Model.pmは、遅延処理でAPIをインスタンス化します。
has 'profile' => (
is => 'ro',
isa => 'Crossin::API::Profile',
lazy => 1,
builder => '_build_profile'
);
sub _build_profile {
my $self = shift;
return Crossin::API::Profile->new('db' => $self->db);
}
それから、下記のようにController内から呼び出します。
$self->model->profile->get_profile();
最小限の ControllerとAPIに操作を委譲したModelができます。この利点はAPIが完全に分離しているのでAPIを利用したスクリプトが書ける、テストが書きやすいということがあると思います。どうですかね、このデザイン。