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への変換がないので、このモジュールは若干使いにくいですが、このテクニックは結構便利かもしれない。