Mojoliciousを使う時のMojo::Base -baseとかの使い分けのまとめ

perlのフレームワークである「mojolicious」を使っていると、use Mojo::Base -base;と書かれていたり、use MojoBase "Controller";みたいな書き方があるけど、これらはどの様な違いがあるのか気になったので調べました。

use Mojo::Baseの使い方

公式ドキュメント(Mojo::Base – Minimal base class for Mojo projects)によると、use Mojo::Baseには以下の4つの書き方がある。

use Mojo::Base -strict;

use Mojo::Base -strict;と書くと、以下の様に書いたのと同等の働きがある。

use strict;
use warnings;
use utf8;
use feature ':5.10';
use mro;
use IO::Handle ();

perlを扱う時によく使うモジュール集を一気にuseしてくれる、と言う働き。ただし、Mojo::Base自体が読み込まれることはない。

use Mojo::Base -base;

これは上記のuse Mojo::Base -strict;で読み込まれるモジュールに加え、Mojo::Baseを@INC変数に入れる等の処理も行う。

Mojoliciousアプリのstartup関数が定義されているファイルでよく見かける。

use strict;
use warnings;
use utf8;
use feature ':5.10';
use mro;
use IO::Handle ();
push @ISA, 'Mojo::Base';
sub has { Mojo::Base::attr(__PACKAGE__, @_) }

use Mojo::Base ‘SomeBaseClass’;

自分で定義したModelクラスやControllerクラスで多用する書き方。単にextends "MyAPP::Controller";の様に書くよりも多くの事をおこなってくれる。

use strict;
use warnings;
use utf8;
use feature ':5.10';
use mro;
use IO::Handle ();
require SomeBaseClass;
push @ISA, 'SomeBaseClass';
sub has { Mojo::Base::attr(__PACKAGE__, @_) }

use Mojo::Base -role;

名前の通りRoleに関するモジュールを読み込んでくれる書き方。

use strict;
use warnings;
use utf8;
use feature ':5.10';
use mro;
use IO::Handle ();
use Role::Tiny;
sub has { Mojo::Base::attr(__PACKAGE__, @_) }

他のMojo関連のモジュール達

use Mojo::Base以外にもMojoliciousは様々な便利なモジュールを用意してくれています。

Test::Mojo

mojoliciousのテストを書くためのモジュール。get_okとかstatus_isの様なwebアプリのテストに必要なメソッドを用意してくれる。

テストコードの中身を見ると、大体use Test::Moreと一緒に書かれていることが多い。

参考:Test::Mojo – Testing Mojo

Mojo::Util

webアプリを作る際の便利メソッド集。空白文字などを取り除いてくれるtrimメソッドや、encodeメソッドなどが用意してくれています。

自作のUtilモジュールを作って、そのモジュールの中にuse Mojo::Utilと書くのが良いかと。

参考:Mojo::Util – Portable utility functions

他にもMojo::DOMとかMojo::JsonとかMojo側が多くのモジュールを用意してくれているので、詳しくは公式ドキュメントをチェックすると良い。

ReratedPosts

perlで「Can't locate Sample/Module.pm in @INC」と言うエラーが起こる原因と対処法3つ
perl(Mojolicious)をレンタルサーバーXserverを使って公開する手順まとめ
Mojoliciousで「Can't use string ("Controller") as a HASH ref while "strict refs" in use」のエラーが発生した時の対策
perlで正規表現で文字列を置換したり、新しい変数に格納する方法
Mojoliciousで「[error] Role::Tiny 2.000001+ is required for roles」のエラーが出た時の対処法
perlのコードでよく見かけるrequire、use、BEGINの役割や関係についてまとめる