如何配置Dancer2和Template Toolkit以使用不同的Stash模块

时间:2017-10-09 10:59:58

标签: perl template-toolkit dancer

如何在Dancer2网站中修改Template Toolkit的默认配置以使用Template::Stash::AutoEscaping

1 个答案:

答案 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。我将把它作为读者的练习。