如何在Mojolicious中访问当前模板名称?

sim*_*one 8 perl mojolicious

我想从模板内部访问Mojolicious中的模板名称以进行调试,就像Template Toolkit一样(参见这里)

变量__FILE__工作得很整齐,但它引用的是当前文件,而不是顶级模板,这意味着它在布局模板中无用.

我也试过了

<%= app->renderer->template_name %>
Run Code Online (Sandbox Code Playgroud)

但没有结果

在Mojolicious有可能吗?

sim*_*one 1

这可以通过两种略有不同的方式来完成:

首先添加一个before_render钩子并设置一个变量。将其全部打包到插件中很容易,如下所示:

package Mojolicious::Plugin::TemplateName;

use Mojo::Base 'Mojolicious::Plugin';

sub register {
    my ($self, $app, $conf) = @_;

    $app->helper('template' => sub { return shift->stash('mojo.template') });
    $app->hook(before_render => sub {
           my $c = shift;
           $c->stash('mojo.template', $_[0]->{template} )
           });
}

1;
Run Code Online (Sandbox Code Playgroud)

并在这样的模板中使用它

<%= template %>
Run Code Online (Sandbox Code Playgroud)

其次,它可以在模板内部完成 - 通过在模板本身内部设置变量:

% stash('template', __FILE__);
Run Code Online (Sandbox Code Playgroud)

然后在布局中重用该变量:

<%= $template %>        
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您将获得带有后缀的文件名和所有内容 - 而不仅仅是模板。

受到有关模板由内而外渲染的答案的启发。