例えば
$ mojo generate app MyApp::Web
としてつくった時にControllerは MyApp::Web::Example.pm
などのように配置されます。より細かくディレクトリを構造化したい場合にはそうじゃなくって MyApp::Web::Controller::Example.pm
に置きたいかもしれませんね。そんな時はRoutingするところのnamespaceをいじります。
$r->namespaces([qw/MyApp::Web::Controller]);
この Mojolicious::Routes
オブジェクトの namespaces
は配列リファレンスを格納していてデフォルトだとこの場合 MyApp::Web
が入っているので、そのままだとそれ以下のモジュールをControllerとみなしているのです。「配列に格納」ってことは上記のように一つだけのnamespaceの名前空間を値として一個だけ入れるんじゃなくて複数入れることも出来ます。そして配列の先頭から優先的にControllerをみつけていく流れになります。
この辺り簡単に以下のようなwarnダンプでも確認出来ます。
unshift $r->namespaces(), 'MyApp::Controller';
use YAML;
warn Dump $r->namespaces();
- MyApp::Controller
- MyApp
実はControllerのnamespace以外にも諸々ロードするパスなどを lib/MyApp/Web.pm
ファイル内を変更することで可能です。これらも基本的に配列で保持され先頭の値を優先的に読む仕様になっている(はず!
例えばスタティックファイルを置いているパスを追加するには
unshift @{$self->static->paths}, '/home/yusuke/public';
とすればよいし、テンプレートを置く場所も
unshift @{$self->renderer->paths}, '/home/yusuke/templates';
と書けばパスを追加出来ますね。
ってことで、namespaceやパスを変更する方法とそしてダンプすればだいたい分かるよ!ってことを書きました。