2017-10-09 5 views

答えて

6

あなたの設定ファイルに新しいオブジェクトを作成するPerlコードを書くことはできません。代わりに、私はDancer2 :: Template :: TemplateToolkitクラスをサブクラス化し、そこに変更を加え、代わりにそれを使用します。

コードD2::T::TTを見ると、方法_build_engineのオブジェクトが作成されて返されます。あなたのサブクラスのaroundでこれをラップすると、それをつかんで変更を加えることができます。

package Dancer2::Template::TemplateToolkit::AutoEscaping; 

use Moo; 
use Template::Stash::AutoEscaping; 

extends 'Dancer2::Template::TemplateToolkit'; 

around '_build_engine' => sub { 
    my $orig = shift; 
    my $self = shift; 

    my $tt = $self->$orig(@_); 

    # replace the stash object 
    $tt->service->context->{STASH} = Template::Stash::AutoEscaping->new; 

    return $tt; 
}; 

1; 

これは醜いハックのビットで、クラスの内部に臨検することは良いアイデアになることはありませんが、その後Template::Contextstashオブジェクトを変更する方法はありません。 ->stashメソッドは読み取り専用であり、実行時にのみ設定できます。

template_toolkitではなく、新しいサブクラスを設定ファイルで使用できます。

engines: 
    template: 
    TemplateToolkit::AutoEscaping: 
     start_tag: '<%' 
     end_tag: '%>' 

これはあなたがあなたの設定ファイルにSTASHのために加えたかもしれない任意の構成を失うことになりますので注意してください。明示的にラッパーの設定を取得し、STASHがあればそれを除外して、新しいnewに渡してください。私はそれを読者のための練習として残します。

関連する問題