アクションの結果の返し方によって、post_runコールバックの実行順が変わって嵌まったメモ
世界で今の僕ぐらいしか困ってないメモ。
build_page
してテンプレートを処理して返すアクション(メソッド)と、テンプレート自体を返すアクションでは、template_param
等のページ加工用コールバックと、post_run
コールバックの実行順が変わる。
コールバックの実行順をアテにしてると死ぬ。そのようなコードはカオスになるので極力避けるべき。
サンプルコード
以下のコードはどちらも、Entryのコンテキストを持つ、テンプレートhoge.tmpl
を処理した結果を返すものだが、コールバックの実行順が異なる。
template_source
→ template_param
→ template_output
→ post_run
→ take_down
sub hoge {
my $app = shift;
# hoge
$tmpl = $app->load_tmpl('hoge.tmpl');
my $ctx = $tmpl->context;
$ctx->stash( 'entry', $entry );
return $app->build_page($tmpl);
}
post_run
→ template_source
→ template_param
→ template_output
→ take_down
sub hoge {
my $app = shift;
# hoge
$tmpl = $app->load_tmpl('hoge.tmpl');
my $ctx = $tmpl->context;
$ctx->stash('entry', $entry);
return $tmpl;
}
原因
MT::App::run
で、アクション実行後を示す$app->post_run()
が呼ばれた後に、戻り値がMT::Template
のインスタンスであればビルド、とうコードになっている。