Debuginfo

思考とアウトプット

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を利用したスクリプトが書ける、テストが書きやすいということがあると思います。どうですかね、このデザイン。