2013.12.18 書き直しました。
Perlでフレームワークを使用するときはMojoliciousを使用することにしています。
とはいってもあまりちゃんと使ったことがないので、悩む点がちょこちょこありました。
Mojoliciousドキュメント 日本語訳をただ読んでみても理解が進まないので、とりあえず書いてみて確かめながら勉強中です。
何がわからなかったのか?
URLが多階層になった場合の記述がよくわかりませんでした。
たとえば、
http://localhost/test/
とかの場合だと、
$r->get('/test')->to('test#test');
で問題なく動きますし、
$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