Posted at

Mojoliciousの内部のnamespace/pathについて確認

More than 5 years have passed since last update.

例えば

$ mojo generate app MyApp::Web

としてつくった時にControllerは MyApp::Web::Example.pm などのように配置されます。より細かくディレクトリを構造化したい場合にはそうじゃなくって MyApp::Web::Controller::Example.pm に置きたいかもしれませんね。そんな時はRoutingするところのnamespaceをいじります。


lib/MyApp/Web.pm

$r->namespaces([qw/MyApp::Web::Controller]);


この Mojolicious::Routes オブジェクトの namespaces は配列リファレンスを格納していてデフォルトだとこの場合 MyApp::Web が入っているので、そのままだとそれ以下のモジュールをControllerとみなしているのです。「配列に格納」ってことは上記のように一つだけのnamespaceの名前空間を値として一個だけ入れるんじゃなくて複数入れることも出来ます。そして配列の先頭から優先的にControllerをみつけていく流れになります。

この辺り簡単に以下のようなwarnダンプでも確認出来ます。


lib/MyApp/Web.pm

unshift $r->namespaces(), 'MyApp::Controller';

use YAML;
warn Dump $r->namespaces();

- MyApp::Controller

- MyApp

実はControllerのnamespace以外にも諸々ロードするパスなどを lib/MyApp/Web.pm ファイル内を変更することで可能です。これらも基本的に配列で保持され先頭の値を優先的に読む仕様になっている(はず!

例えばスタティックファイルを置いているパスを追加するには


lib/MyApp/Web.pm

unshift @{$self->static->paths}, '/home/yusuke/public';


とすればよいし、テンプレートを置く場所も


lib/MyApp/Web.pm

unshift @{$self->renderer->paths}, '/home/yusuke/templates';


と書けばパスを追加出来ますね。

ってことで、namespaceやパスを変更する方法とそしてダンプすればだいたい分かるよ!ってことを書きました。