如何在Dancer2网站中修改Template Toolkit的默认配置以使用Template::Stash::AutoEscaping?
答案 0 :(得分:6)
显然,您不能编写在配置文件中创建新对象的Perl代码。相反,我会继承Dancer2 :: Template :: TemplateToolkit类,在那里进行修改,然后使用它。
如果您查看代码或D2::T::TT,您可以看到它创建并返回方法$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::Context没有提供更改stash
对象的方法。 ->stash
方法只是一个读者,只能在运行时设置。
然后,您可以在配置文件中使用新的子类,而不是template_toolkit
。
engines:
template:
TemplateToolkit::AutoEscaping:
start_tag: '<%'
end_tag: '%>'
请注意,这将使您放弃为配置文件中的STASH
添加的任何配置。您必须在包装器中明确获取配置,如果有,请过滤掉STASH
并将其传递给新的new
。我将把它作为读者的练习。