« XML::Simpleで変換したPerlのデータ構造を一気に文字コード変換 | メイン | Redirectって相対リンクでもいけるのね。 »

CGI::Application::Plugin::Redirect

CGI::Application::Plugin::Redirectが出ていますね。名前から想像する通り、redirectの処理を行ってくれるものです。

package MyApp;
use base qw(CGI::Application);
use CGI::Application::Plugin::Redirect;

sub start {
  my $self = shift;
  return $self->redirect('http://www.example.com/');
}


リダイレクトの相対→絶対への変換はサポートしていないのであまり役に立ちそうもないかなぁと思ってましたが、ところがどっこい。1つ面白い機能がありました。
cgiapp_prerunでのリダイレクト、

package MyApp;
use base qw(CGI::Application);

sub cgiapp_prerun{
  my $self = shift;
  if(なんちゅら){
    $self->header_add(-location =>'http://www.example.com/');
    $self->header_type('redirect');
  }
}

は正しく動作しません。CGI::AppにはSledgeのfinishメソッドのようなものがないので、prerunでredirectの処理をしていても何か工夫をしない限りその後のmodeは普通に動きます。header_type の下にexitを書くという手もprerunがevalの中で実行されているので不可。
CGI::Application::Plugin::Redirectはそのあたりも面倒を見てくれます。ソースをみると、

sub redirect {
    my $self     = shift;
    my $location = shift;

    # The eval may fail, but we don't care
    eval {
        $self->run_modes( dummy_redirect => sub { } );#何もしないmodeを追加
        $self->prerun_mode('dummy_redirect');#prerunの中でprerun_modeを利用してmodeを切り替えられる
    };

    $self->header_add( -location => $location );
    $self->header_type('redirect');
    return;
}

evalのコードの中で、dummy_redirectというrun_modeを設定して、prerun_modeにそのmode名を入れてます。こうすることでredirect後の動作が、何もしないダミーになるのでよけいなことをする心配がなくなります。

相対URLから絶対URLへの変換がないので、このモジュールは若干使いにくいですが、このテクニックは結構便利かもしれない。

トラックバック

この一覧は、次のエントリーを参照しています: CGI::Application::Plugin::Redirect:

» [Perl]CGI::Application::Plugin::Redirectのredirect()メソッドを改造してみた from 刺身☆ブーメラン(金子健介)のはてなダイアリー
[http://norainu.net/mt/archives/2005/09/cgiapplicationd_1.html:title=おまえのログ/CGI::Application::Dispatch勉強中その2]をうけた[https://blog.nomadscafe.jp/archives/000463.html:title=blog.nomadscafe.jp/PATH_INFOと相対パス(リンク)]でのredirect_dispatc... [詳しくはこちら]