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 の配列で取得。