motivation: デフォルトのアプリケーションをセットしたい。
↓起動
CGI::ExceptionManager->run(
callback => \&NanoA::Dispatch::dispatch,
powered_by => 'NanoA',
);
NanoA::Dispatch以下
- PATH_INFOから$handler_path取得
- $handler_pathがからの場合→app/indexディレクトリがあったら、/index/にリダイレクト
- ..を消す→ディレクトリとラバー去る
- $handler_pathが/で終わってたら→startに振る
- NanoA::Configを初期化確認
- $handler_pathでload_config
- $handler_pathから$app_name取得→できなかったらsystem
- $app_name以下にconfig.pmがあったらロード→なかったらNanoA::Configをロード
- ロードしたconfigを({app_name => $app_name})でインスタンス化して返す
- configにcamelizeがあったら$handler_pathをcamelize
- load_handlerで$handler_klassを導出
sub load_handler {
my ($klass, $config, $path) = @_;
my $handler_klass;
foreach my $loader (@{$config->loaders}) {
$handler_klass = $loader->($klass, $config, $path)
and last;
}
$handler_klass;
}
- NanoA::Configのloadersは
loaders => [
\&NanoA::Dispatch::load_mojo_template,
\&NanoA::Dispatch::load_pm,
],
- mtをロードする→なかったらpmをロード
- このときconfigが関係あるのはmtのロードのときにcacheディレクトリの指定を見る
- デフォルトは↓こう
mt_cache_dir => "/tmp/nanoa.${NanoA::VERSION}.$>.mt_cache",
- みつかんなかったらnot_foundハンドラをロード
- あとはそいつを実行
で、結局のところなんでデフォルトがああいうのかというと、
not_found => 'system/not_found',
となっていて、app/system/not_found.mtが↓こうなってて、system/app_listになってるから。
? my $pi = $app->query->path_info;
? return $app->render('system/app_list') unless $pi;
<? $app->header(-status => 404); ?>
<?= $app->render('system/header') ?>
<h2>File Not Found</h2>
File Not Found. The list of installed applications can be found: <a href="<?= $app->nanoa_uri ?>">here</a>.
<?= $app->render('system/footer') ?>