うまいぼうぶろぐ

linuxとhttpdとperlのメモ

CGI::Application::Dispatch 勉強

run mode

CGI::Application::Plugin::AutoRunmodeを使えば、run_modesをいちいち設定しなくても、PAHT_INFOから同一のメソッドを探す。そのメソッドには

  • StartRumode : setupのstart_modeに該当
  • Runmode : その他のmode

アトリビュートを設定する必要がある。

ただし、start メソッドを書いても上記のように環境変数が吐かれるのでstartを消したければrun_modesにstartは書く必要がある?

また、直接 CGI::Applicationを継承しないで 自作モジュール MyAppでCGI::Applicationを継承している場合MyApp::Foo.pm を直接 perl -c すると

Invalid CODE attribute: StartRunmode at Index.pm line 30
BEGIN failed--compilation aborted at Index.pm line 30.

といわれる。

config

yamlから設定情報を読む例。

cgiapp_init中にでconfig_fileで読む。CGI::Application::Plugin::Config::YAMLもいる。他の人のソース読むとPluggableで指定してたけど、違いはわかってない。必要になったときだけ読むとか?

use CGI::Application::Pluggable qw(Config::YAML);
##use CGI::Application::Plugin::Config::YAML;
	
sub cgiapp_init {
  my $self = shift;
  ## 何か他の処理
  $self->config_file( '/path/to/config.yaml' );
}

後は$self->config_param(); $self->config_param('hoge') とかで読む。

dispatch_args を設定した場合のtable設定

sub dispatch_args {
  return {
    prefix => 'MyApp',
    table => [
      ''          => { app => 'Index', rm => 'index' },
      ':app/:rm'  => { },
    ],
  };
}

dispatch_argsを設定すると、このtableのルールに基づいてアプリが起動されるので、各モジュールのstart_modeは意味ない?例えば↑のような設定だと

/app/dispatch.cgi/index/index/ アクセスOK
/app/dispatch.cgi/index/ not found

というわけでdispatch tableでデフォルトのランモード書いたらいいのか?

  ''         => { app => 'Index', rm => 'index' },
  ':app/'    => { rm => 'index' },
  ':app/:rm' => { },

変数

  • 特殊な変数トークン
    • :app => モジュール名
    • :rm => ランモード
  • 普通の変数

それ以外は $self->param('key'); で取れる。

  'foo/:bar' => { app => 'Foo', },

こうdispatch tableに設定していたら、Fooモジュールの各ランモード内で

$self->param('bar') 

で値を取得できる。

  • オプション変数

最後に?がついているもの。使う場合はURLの末尾に設定するのがベスト。

使う場合はルールの最後尾に書くこと。デフォルトはdispatch_url_remainder パラメータに設定される。変更する場合は'*'の引数を設定。

  'foo/bar/*' => { app => 'Foo', '*' => 'hogehoge' },
$self->param('dispatch_url_remainder');

QUERY_STRING

$self->query->param('key'); で取れる。トークンの$self->param(); と勘違いしないように。クエリ一覧は$self->query->param の配列で取得。