找不到 Mojolicious 控制器中的模板

Template in Mojolicious controller not found

我正在尝试提供包含在控制器 class 的 __DATA__ 部分中的模板,但它似乎不起作用。

在我的主 app.pl 文件中有

#!/usr/bin/env perl
use Mojolicious::Lite -signatures;
use FindBin qw($Bin);
use lib "$Bin/lib";


push @{app->renderer->classes},   'Zairyo::Controller::Data';
push @{app->preload_namespaces},  'Zairyo::Controller::Data';

get '/:uid'  => [uid => qr/[a-z0-9]{32,32}/i ] => { controller => 'Data', action => 'serve_iframe' };

app->start;

并在 Zairyo::Controller::Data 中:

package Zairyo::Controller::Data;

use Mojo::Base 'Mojolicious::Controller', -signatures;

sub serve_iframe ($c) {
    $c->render(template => 'foo');
}

__DATA___

@@ foo.html.ep
what is this

我希望按照 documentation 工作,但在浏览器上抛出错误 Could not render a response... 并在日志上抛出 Template "foo.html.ep" not found

我已经解决了这个问题

$c->render(inline => data_section(__PACKAGE__, 'foo.html.ep') );

但这似乎有点乱。

我做错了什么?

首先,您的 Data.pm:

  • __DATA后面有三个下划线,本来应该有两个下划线和一个换行
  • 模块没有return真值

这是我最终得到的结果:

package Zairyo::Controller::Data;

use Mojo::Base 'Mojolicious::Controller', -signatures;

sub serve_iframe ($c) {
    $c->render(template => 'foo' );
}

1;

__DATA__

@@ foo.html.ep
what is this

在主脚本中,我在调用 start 之前加载了 class。请注意 docs say:

Note that for templates to be detected, these classes need to have already been loaded and added before warmup is called

而且,warmup立即被start调用,关心preload_namespaces的是warmup。您需要更快到达那里,因此 preload_namespaces 对这个特定问题没有任何作用。如果您尚未加载该模块,将不会检测到其 __DATA__ 模板。

#!/usr/bin/env perl
use Mojolicious::Lite -signatures;
use FindBin qw($Bin);
use lib "$Bin/lib";

push @{app->renderer->classes}, map { Mojo::Loader::load_class($_); $_ } 'Zairyo::Controller::Data';

get '/:uid'  => [uid => qr/[a-z0-9]{32,32}/i ] => {
    namespace  => 'Zairyo::Controller',
    controller => 'Data',
    action     => 'serve_iframe'
    };

app->start;

我不是在建议这个特定的代码,但现在我知道为什么你没有得到你想要的。