perl Mojolicious:1 perl
# コマンド実態
sub run {
# コマンドライン引数は@argsに格納されます
my ($self @args) = @_;
# コマンドライン引数をパースします
GetOptionsFromArray(¥@args d|debug => ¥(my $debug))
or die $self->usage;
Perlでフレームワークを使用するときはMojoliciousを使用することにしています。
とはいってもあまりちゃんと使ったことがないので、悩む点がちょこちょこありました。
Mojoliciousドキュメント 日本語訳をただ読んでみても理解が進まないので、とりあえず書いてみて確かめながら勉強中です。
何がわからなかったのか?
URLが多階層になった場合の記述がよくわかりませんでした。
たとえば、
http://localhost/test/
とかの場合だと、
Test.pm
$r->get( /test )->to( test#test );
で問題なく動きますし、
Test.pm
$r->get( /test/lowpage )->to( lowpage#test );
でも動くのですが、lib内のアプリ本体直下のファイル数がやたら増えるので嫌だし、何でもかんでもプレースホルダー使って取得してしまうのも間違っていると思うし、ぐちゃぐちゃして嫌なのでした。
もっと具体的に言えば、
$r->get( /hoge ) を Test::Hoge->hoge()
$r->get( /hoge/piyo ) を Test::Hoge->piyo()
にしたい、って感じです。
調べても全然出てこなくて。というか、文書を読んでも理解できなかっただけなんですけれど。
結論
試行錯誤の過程を書いても仕方がないので、結果を。
$r->get( /foo )->to( foo#foo );
$r->get( /foo/bar )->to( foo-bar#bar );
$r->get( /baz/qux )->to( baz-qux_quux#foo_bar );
と記述した場合、呼び出されるファイルは以下でした。
$r->get( /foo )->to( foo#foo );
コントローラ:lib/MyAPP/Foo.pm の sub foo
テンプレート:template/foo/foo.html.ep
$r->get( /foo/bar )->to( foo-bar#bar );
コントローラ:lib/MyAPP/Foo/Bar.pm の sub bar
テンプレート:template/foo/bar/bar.html.ep
$r->get( /baz/qux )->to( baz-qux_quux#foo_bar );
コントローラ:lib/MyAPP/Baz/QuxQuux.pm の sub foo_bar
テンプレート:template/baz/qux_quux/foo_bar.html.ep