mastering cgi::application
TRANSCRIPT
Mastering CGI::Application
2008/05/12Hideo Kimura
CGI::Application
• CGI::Application クラスを継承してメソッドをオーバーライドしてフックポイントをほげほげして作るフレームワーク
フックポイントmy %INSTALLED_CALLBACKS = (# hook name package sub
init => { 'CGI::Application' => [ 'cgiapp_init' ] },prerun => { 'CGI::Application' => [ 'cgiapp_prerun' ] },postrun => { 'CGI::Application' => [ 'cgiapp_postrun' ] },teardown => { 'CGI::Application' => [ 'teardown' ] },load_tmpl => { },
error => { },);
sub をオーバーライド実装することによって各フックポイントに登録される
呼び出し順序new init (cgiapp_init) setup
run prerun (cgiapp_prerun) [runmode]
( errror (error) if $@ ) postrun (cgiapp_postrun) teardown (teardown)
コールバックインターフェースsub cgiapp_init { my ( $self, @args ) = @_;}
sub cgiapp_prerun { my ( $self, $rm ) = @_;}
sub cgiapp_postrun { my ( $self, $bodyref ) = @_;}
コールバックインターフェースの意味
• 意外と自由• ただ perldoc によると
– 設定ファイルの読み込みなんかは init– setup は runmode の設定とテンプレートパス
に使うべき– 認証や runmode の変更は prerun
Plugin の書き方
• add_callback([hook point], CODEREF)– 既存のフックポイントにコールバックを登録
• new_hook ([hook point])– 新たにフックポイントを追加する
• call_hook([hook point], args)– フックポイントを呼び出す
• Exporter でメソッドを生やす
Plugin で拡張package CGI::Application::Plugin::MyPlugin;
use vars qw(@EXPORT);
use base ‘Exporter’;
@EXPORT = qw(my_method);
sub import { my $pkg = shift; my $callpkg = caller;
$caller->add_callback(‘init’, ‘my_init’); $caller->new_hookpoint (‘my_hook’);
goto &Exporter::import}
お勧め Plugin
• CGI::Application::Plugin::Template• CGI::Application::Plugin::Session• CGI::Application::Plugin::ConfigAuto• CGI::Application::Plugin::FillInForm• CGI::Application::Plugin::Redirect• CGI::Application::Plugin::Forward• CGI::Application::Plugin::Stash
結論• いいとこ
– かなりシンプル (620 行くらい )– Plugin が結構豊富
• だめなとこ– シンプルすぎる = ディスパッチャーとしての機能し
かない– その割にディスパッチが面倒
• CGI::Application::Dispatch とかあるけど、あれを使うくらいなら Catalyst のほうがまし
• 小規模なら CGI::Application 、大規模なら Catalyst
ご清聴ありがとうございましたm(_ _)m