【发布时间】:2011-11-21 04:16:30
【问题描述】:
使用Dancer时如何在模板工具包中添加vmethod?
如果没有办法,我如何添加一个函数/如何执行对添加到令牌的函数的引用/?
【问题讨论】:
标签: perl template-toolkit dancer
使用Dancer时如何在模板工具包中添加vmethod?
如果没有办法,我如何添加一个函数/如何执行对添加到令牌的函数的引用/?
【问题讨论】:
标签: perl template-toolkit dancer
我不确定是否要添加 vmethod,但我认为第二件事可以这样完成:
hook 'before_template' => sub {
my $tokens = shift;
$tokens->{myfunction} = sub { ... }; # OR ...
$tokens->{otherfunction} = \&other_func;
};
【讨论】:
要将custom vmethod 添加到Dancer 中的TT 需要对直接TT 包变量进行一些处理。我确实希望Dancer::Template 对象提供对底层模板对象的访问。
这是可以进入 Dancer 路线的 sn-p:
package mydancerapp;
use Dancer qw(:syntax);
# make sure TT module is loaded since Dancer loads it later in the request cycle
use Template::Stash;
# create list op vmethod, sorry its pretty trivial
$Template::Stash::LIST_OPS->{ uc_first } = sub {
my $list = shift;
return [ map { ucfirst } @$list ];
);
最好将其移动到自己的模块mydancerapp::TT 或mydancerapp::TT::VMethods 中,然后将其加载到您的主应用程序类中。
然后您可以在模板中使用它,例如:
# in route
get '/' => sub {
template 'index', { veggies => [ qw( radishes lettuce beans squash )] };
};
# in template: views/index.tt
<p>[% veggies.uc_first.join(',') %]</p>
如果一切顺利,您应该会在输出中看到:Radishes,Lettuce,Beans,Squash。 :)
【讨论】:
在 Dancer2 中,您可以这样做:
hook before => sub {
my ( $app ) = @_;
$app->template_engine->engine->context->define_vmethod( 'list' => 'uc_first' => sub {
my $list = shift;
return [ map { ucfirst } @$list ];
});
};
【讨论】: