俺得フレームワークMaltsの話。
package MyApp::Web::Dispatcher; use strict; use warnings; use Malts::Web::Router::Simple; mount '/user/:user_id' => 'User'; get '/' => sub { # / my ($self, $c) = @_; $c->render(200, 'root/index.tx'); }; 1;
package MyApp::Web::Dispatcher::User; use strict; use warnings; use Malts::Web::Router::Simple; get '/' => sub { # /user/1 or /user/1/ my ($self, $c) = @_; my $user_id = $c->args->{user_id}; $c->render(200, 'user/index.tx'); }; get '/mount' => sub { # /user/1/mount my ($self, $c) = @_; my $user_id = $c->args->{user_id}; $c->render(200, 'user/mount.tx'); }; 1;
mountというのを追加したので、こういう事が出来るようになりました。
mountとか一々書くのめんどくさいぜ!ファック!という人向けに、auto_mount;というのを作りました。
package MyApp::Web::Dispatcher::Post; ...; package MyApp::Web::Dispatcher::ChiChin::Puipui; ...; package MyApp::Web::Dispatcher; use strict; use warnings; use Malts::Web::Router::Simple; mount '/user/:user_id' => 'User'; auto_mount; # mount '/post' => 'Post'; # mount '/chichin/puipui' => 'Chichin::Puipui'; 1;
既にmountしてあるものは無視します。
ただ、どの順番でmountに登録されるのか指定出来ないし、すごい分かりにくそうになるパターンありそうだな〜と思います。
package MyApp::Web::Dispatcher::User; ...; package MyApp::Web::Dispatcher::User::Post; ...; package MyApp::Web::Dispatcher; ...; mount '/user/:user_id' => 'User'; auto_mount; # mount '/user/post' => 'User::Post'; 1;
この場合だと/user/postにアクセスしても、/user/:user_idに振り分けられる。
明示的にやったほうがいいような気がします。
あと今まではMyApp::Web::Dispatcher::Userとかにあるやつも自動でMyApp::Web::Dispatcherにあるとみなしてたんだけど、それはやめました。
Malts::Web::Router::Simpleは、あと2つくらいやりたい事があるので、それは分けて説明する。よてい。
(もうシンプルじゃない…)