2017-10-09 2 views

Répondre

6

Vous ne pouvez évidemment pas écrire de code Perl qui crée un nouvel objet dans votre fichier de configuration. Au lieu de cela, je voudrais sous-classer la classe Dancer2 :: Template :: TemplateToolkit, y apporter les modifications et ensuite l'utiliser à la place. Si vous regardez le code ou D2::T::TT vous pouvez voir qu'il crée et retourne l'objet $tt dans la méthode _build_engine. Si vous enveloppez ceci dans un around dans votre sous-classe, vous pouvez l'attraper et apporter les modifications.

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; 

C'est un peu d'une bidouille horrible et en fouillant dans les entrailles d'une classe est jamais une bonne idée, mais Template::Context ne fournit pas un moyen de changer l'objet stash. La méthode ->stash est uniquement un lecteur et ne peut être définie qu'à l'exécution.

Vous pouvez ensuite utiliser votre nouvelle sous-classe dans votre fichier de configuration au lieu de template_toolkit.

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

Notez que cela vous fera perdre toute configuration que vous pourriez avoir ajouté le STASH dans votre fichier de configuration. Vous devez saisir explicitement la config dans votre wrapper, filtrer le STASH s'il y en a un et le transmettre au nouveau new. Je vais laisser cela comme un exercice pour le lecteur.