MojoでControllerのディレクトリを掘る設定

Mojoliciousはデフォルトでは
lib/AppName/
配下に置かれたファイルがコントローラになります。
でも数が増えてきたらディレクトリ作って管理したいですよね!
そんなときはnamespaceを使うと実現できます。


では、以下のような構成にしたい場合の設定を見てみましょう。

lib/
|-- Demo
|   `-- MyController   →コントローラをここに集めたい
|       `-- Vuvuzela.pm
|       `-- ...
|       `-- ...
`-- Demo.pm

Demoアプリを作る

mojolicious generate app Demo

lib/Demo.pm

package Demo;

use strict;
use warnings;

use base 'Mojolicious';

# This method will run once at server start
sub startup {
    my $self = shift;

    # Routes
    my $r = $self->routes;

    # ルート設定
    #  Podにはいろいろな記述方法が載っているが、
    #  controllerは明示的に指定した方が良いかも
    #  (うまくレンダリングしてくれないことがあった)
    $r->route('/buooo')->to(controller => 'vuvuzela', action => 'boo', namespace => 'Demo::MyController' );
}

1;

lib/Demo/MyController/Vuvuzela.pm

package Demo::MyController::Vuvuzela;

use strict;
use warnings;

use base 'Mojolicious::Controller';

sub boo{
    my $self = shift;
    $self->render(message => '(#‵)3′)▂▂▂▃▄▅ ブオオオオオオ”');
}

1;

template/vuvuzela/boo.html.ep*1

% layout 'default';
<h2><%= $message %></h2>


こんな感じでコントローラクラスが管理できます。
いい感じ!


(※参考)
http://github.com/kraih/mojo/blob/master/lib/Mojolicious/Guides/Routing.pod

*1:後ろのパス2つを「コントローラ」「アクション」と合わせればOK