CGI::Application::URIMapping 0.04

CGI-Application-URIMapping-0.04 - A dispatcher and permalink builder - metacpan.org

URIパーマリンク形式じゃない場合にリダイレクトとか書けるようになった。

例えば、以下のコードだと、

  • users?order_by=name
  • users?category=friends&order_by=age&submit=検索
  • users/friends?order_by=name

といったクエリは、自動的に、それぞれ、

  • users
  • users/friends?order_by=age
  • users/friends

といったパーマリンクにリダイレクトした上で表示される。これで、フォーム入力の結果をパーマリンクに変換するとか、いちいち手で書く必要がなくなる。

package MyApp::Users;

use base qw/CGI::Application/;

MyApp::URIMapping->register({
  path  => 'users/:category?',
  query => [
    {
      name => 'order_by',
      omit => 'name',
    },
  ],
});

sub users {
  my $self = shift;
  
  # パーマリンク形式じゃなければリダイレクト
  return if $self->normalize_uri;
  
  ...
}

別のパッケージからパーマリンクを作るには、

my $uri = MyApp::Users->build_uri([
  { category => $cat },
  $self,
]);

とか書いておけば、category は $cat に、それ以外のパラメータは現在のパラメータを継承して、パーマリンクを作ってくれる。

あとは、同様のパーマリンク化処理として form の onsubmit ハンドラ用の JavaScript を生成するような関数を整備すれば完成かな。