https://metacpan.org/pod/Router::Simple::Reversible
だいぶ昔に書いていたのを shipit しました。tokuhirom さんの Router::Simple に、いわゆるリバースルーティングを足しただけのモジュール。Router::Simple
を継承しているので、bless
しなおすなりして使えばよいかと思います。
新しく生えるメソッド $router->path_for
に $router->match
で返ってくるような hashref を渡すと、いい感じにルーティングのルールが具体化されたかたちで文字列が返ってくるシンプルな API です。テスト を見るとだいたい使い方がわかります:
my $router = Router::Simple::Reversible->new; # from Router::Simple's pod $router->connect('/', {controller => 'Root', action => 'show'}); $router->connect('/blog/{year}/{month}', {controller => 'Blog', action => 'monthly'}); $router->connect('/wiki/:page', { controller => 'WikiPage', action => 'show' } ); $router->connect('/download/*.*', { controller => 'Download', action => 'file' } ); is $router->path_for({ controller => 'Root', action => 'show' }), '/'; is $router->path_for({ controller => 'Blog', action => 'monthly' }, { year => 2015, month => 10 }), '/blog/2015/10'; is $router->path_for({ controller => 'WikiPage', action => 'show' }, { page => 'HelloWorld' }), '/wiki/HelloWorld'; is $router->path_for({ controller => 'Download', action => 'file' }, { splat => [ 'path/to/file', 'xml' ] }), '/download/path/to/file.xml'; is $router->path_for({ controller => 'NoSuchController', action => 'show' }), undef;
何か変なところがあったら GitHub リポジトリ のほうまでお知らせください。