2017-10-09 2 views

Antwort

6

Sie können natürlich keinen Perl-Code schreiben, der ein neues Objekt in Ihrer Konfigurationsdatei erstellt. Stattdessen würde ich die Klasse Dancer2 :: Template :: TemplateToolkit ableiten, die Änderungen dort vornehmen und diese stattdessen verwenden.

Wenn Sie den Code oder D2::T::TT betrachten, können Sie sehen, dass es das Objekt $tt in der Methode _build_engine erstellt und zurückgibt. Wenn Sie dies in eine around Ihrer Unterklasse einfügen, können Sie sie greifen und die Änderungen vornehmen.

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; 

Dies ist ein bisschen ein hässlicher Hack und in die Interna einer Klasse ist wühlen nie eine gute Idee, aber dann Template::Context bietet keine Möglichkeit, die stash Objekt zu ändern. Die Methode ->stash ist nur ein Lesegerät und kann nur zur Laufzeit gesetzt werden.

Sie können dann Ihre neue Unterklasse in Ihrer Konfigurationsdatei anstelle von template_toolkit verwenden.

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

Beachten Sie, dass dies wird Ihnen jede Konfiguration machen verlieren Sie die STASH in Ihrer Konfigurationsdatei hinzugefügt haben könnte. Sie müssten die Konfiguration explizit in Ihrem Wrapper erfassen, die STASH herausfiltern, wenn es eine gibt, und sie an die neue new weiterleiten. Ich werde das als eine Übung für den Leser verlassen.

Verwandte Themen