« djbdns にパッチをあてて Anti-DNS Pinning 対策 | メイン | Japanize - Internet Explorer に対応しました »

2007年11月14日

CGI::Application 用にディスパッチャ兼パーマリンクジェネレータを書いてみた

 パーマリンク生成とディスパッチャが同居しているようなウェブアプリケーションのフレームワークはないのかな、という話を同僚の山口さんに振ったところ、「以前 Catalyst::Plugin::BuildURI というモジュールを書いたよ」という答えがかえってきました。でも今更 Catalyst ベースに書き直すのもなぁ、ということで、青い芝を横目で眺めつつ、CGI::Application 用のディスパッチャ兼パーマリンクジェネレータを書いてみました。

CGI-Application-URIMapping-0.02.tar.gz

 使い方は以下のような感じです。各モジュールの先頭で register してやることで、ハンドラのマッピングとパーマリンク生成関数のインストールが行われます。ディスパッチャとパーマリンク生成機構が一体になっているので、

  • フォーム入力を path_info に正規化
  • クエリパラメータを必要なもののみ並べ直す
  • 一部のパラメータのみを変更した相対リンクを作る
といったことが簡単にできます。いまだに CGI::Application を使っている方は、お試しいただければ幸いです。

MyApp/URIMapping.pm (モジュールのロード)
package MyApp::URIMapping;

use base qw/CGI::Application::URIMapping/;

use MyApp::Start;
use MyApp::Search;
use MyApp::Category;
...
MyApp/Start.pm (トップページ: /)
package MyApp::Start;

use base qw/CGI::Application/;

MyApp::URIMapping->register({
  rm   => 'start',
  path => '',
});

sub start {
  ...
}
MyApp/Search.pm (/search/string)
package MyApp::Search;

use base qw/CGI::Application/;

MyApp::URIMapping->register('search/:q?');

sub search {
  my $self = shift;
  
  # クエリパラメータ q を path_info に付け替え
  $self->redirect($self->build_uri([ $self->query ]))
    if $self->query->param('q');
  
  ...
}
MyApp/Blog.pm (/blog/user_id?page=X&category=Y)
package MyApp::Blog;

use base qw/CGI::Application/;

MyApp::URIMapping->register({
  path  => 'blog/:user_id',
  query => [ qw/page category/ ],
});

sub blog {
  my $self = shift;
  
  # クエリパラメータ page だけをインクリメントしたリンクを生成
  $self->tt_params(
    next_page => $self->build_link([
      { page => $self->query->page + 1 },
      $self,
      $self->query,
    ]),
  );
  
  # 別のパッケージへのリンクを生成
  $self->tt_params(
     search_link => MyApp::Search->build_uri([{
       q => $user_name,
     }]),
  );
  
  ...
}

投稿者 kazuho : 2007年11月14日 12:32 このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

トラックバック

このエントリーのトラックバックURL:
http://labs.cybozu.co.jp/cgi-bin/mt-admin/mt-tbp.cgi/1643