ziguzagu.orgziguzagu.orgCGI::Application::Dispatch勉強中2005-08-28Perl今日は一日mod_perlとCGI::Application::Dispatchの勉強。CGI::Application::Dispatchは、CGI::Applicationで書かれたモジュールのインスタンスCGIをいちいち書かないで、URIから実行するモジュールを判別してインスタンス生成する、という仕組みを提供してくれます。モジュールをrunモードみたいに切り替える、という感じでしょうか(ちょっとわかりにくい...)。PODに詳細はありますが、自分ぐらいの初級レベルの人(PerlOOP暦半年、CGI::App暦3ヶ月)でもわかるように、頭の中の整理もかねてメモしておきます。USERのPerl短期連載で紹介していた記事が激しく参考になります。Perlの話題は、雑誌媒体への露出がPHP/Javaに比べると極端にすくないような気がするので、短期といわず長期的にやってもらいたいですね。自分なりのまとめメモです。通常、CGI::Applicationを使用する場合は、CGI::Applicationを継承したモジュールと、それをインスタンス化するCGIが必要になります。My::App->new();$app->run();この場合のURIは、http://example.com/app.cgi?rm=indexhttp://example.com/app.cgi?rm=editとなります。PATH_INFO形式が利用できる場合は、http://example.com/app.cgi/indexhttp://example.com/app.cgi/editとすることもできます。これに、My::Searchというモジュールが追加になった場合、それをインスタンス化するCGIは次のようになります。My::Search->new();$app->run();app.cgiとsearch.cgiの差はインスタンス化するモジュール名だけですね。このような単純な違いしかないCGIをモジュールの追加のたびに書くのは(たったこれだけでも)非効率的ですし、単純だからこそミスも発生しやすいです。ここで、CGI::Application::Dispatchの出番です。Dispatchを利用した場合、モジュールのインスタンス化は、URIに含まれたモジュール名から自動的に行ってくれます。CGIをいちいち書く必要はありません。Dispatchモジュールを使った場合のURIは、/dispatchのcgi/モジュール名/runモードとすることができます。上記2つのモジュールの例(My::Searchはsearch/configのrunモードをもつ)からいくと、http://example.com/dispatch.cgi/app/indexhttp://example.com/dispatch.cgi/app/edithttp://example.com/dispatch.cgi/search/searchhttp://example.com/dispatch.cgi/search/configとなります。モジュールがどんなに増えても、必要なCGIはdispatch.cgiのみです。そのdispatch.cgiは以下のようになります。モジュール名が指定されなかった場合に実行するモジュール名);これだけです。