Mastering CGI::Application

45,211 views
45,063 views

Published on

Published in: Technology, Business
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
45,211
On SlideShare
0
From Embeds
0
Number of Embeds
21
Actions
Shares
0
Downloads
5
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Mastering CGI::Application

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

×