2017-10-09 77 views

回答

6

你显然不能写在配置文件中创建一个新对象Perl代码。相反,我将继承Dancer2 :: Template :: TemplateToolkit类,进行修改,然后使用它。

如果您看代码或D2::T::TT,您可以看到它创建并返回方法_build_engine中的$tt对象。如果你在你的子类中包装这个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::Context不提供一种方法来改变stash对象。方法->stash只是一个读者,它只能在运行时设置。

然后,您可以使用您的新的子类在你的配置文件,而不是template_toolkit

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

注意,这会让你失去你可能在你的配置文件中添加了STASH任何配置。你必须明确地抓住你的包装中的配置,如果有的话过滤出STASH并将它传递给新的new。我将把它作为读者的练习。