2017-10-09 12 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::Contextstash 객체를 변경하는 방법을 제공하지 않습니다. ->stash 메서드는 읽기 전용이며 런타임에만 설정할 수 있습니다.

그런 다음 구성 파일에서 template_toolkit 대신 새 하위 클래스를 사용할 수 있습니다. 이것은 당신이 당신의 설정 파일에 STASH에 추가했을 수있는 구성을 잃게 만들 것입니다

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

참고. 래퍼에서 명시 적으로 구성을 가져 와서 STASH이 있으면 필터링하여 새 new에 전달하십시오. 나는 그것을 독자를위한 운동으로 남겨 둘 것이다.