sim*_*que 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;
Run Code Online (Sandbox Code Playgroud)

这是一个丑陋的黑客攻击,并且在类的内部进行翻译从来都不是一个好主意,但是然后Template :: Context不提供更改stash对象的方法.该->stash方法只是一个阅读器,它只能在运行时设置.

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

engines:
  template:
    TemplateToolkit::AutoEscaping:
      start_tag: '<%'
      end_tag:   '%>'
Run Code Online (Sandbox Code Playgroud)

请注意,这将使您放弃STASH在配置文件中添加的任何配置.您必须在包装器中明确地获取配置,过滤掉STASH是否有一个并将其传递给新的new.我将把它作为读者的练习.