我有以下.htaccess文件:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !/views/.*/.*\.html
RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/(.*)$ index.pl?controller=$1&action=$2&id=$3
这允许我将/ Users / show / 1等请求转发到我的主控制器。我也可以访问模板文件;至少在我的浏览器中我可以打开文件:
/views/Users/add.html
但是,当我想要渲染模板时,当我尝试访问控制器中的文件时,找不到它(没有这样的文件或目录)
这是我尝试渲染模板的代码:
package UsersController;
use Moose;
use Controllers::ControllerRole;
use Template;
with 'ControllerRole';
has 'example' => (
is => 'rw',
isa => 'Str',
default =>'test',
);
sub show {
my $self = shift;
my $id = $self->{params}->{id};
my $config = {
INTERPOLATE => 1, # expand "$var" in plain text
POST_CHOMP => 1, # cleanup whitespace
PRE_PROCESS => 'header', # prefix each template
EVAL_PERL => 1, # evaluate Perl code blocks
};
my $vars = {
id => $id,
};
my $template = Template->new();
$template->process('views/Users/add.html', $vars) || die "$!";
}
1;
我也试过使用绝对或相对路径,但是apache抱怨这是不允许的
查看项目的文件结构可能会有所帮助:
更新:
如果我使用chdir
我可以使用Perl的开放功能open
该文件,但是尝试处理该文件我仍然会收到错误
file error - header: not found
这是我的代码的第二次迭代:
sub show {
my $self = shift;
chdir '/srv/http/perlweb';
my $id = $self->{params}->{id};
my $config = {
INTERPOLATE => 1, # expand "$var" in plain text
POST_CHOMP => 1, # cleanup whitespace
PRE_PROCESS => 'header', # prefix each template
EVAL_PERL => 1, # evaluate Perl code blocks
ABSOLUTE => 1,
RELATIVE => 1,
};
my $vars = {
id => $id,
planet => 'earth',
captain => 'kirk',
};
open my $fh, "views/Users/add.html" or die "$!"; #this works
close $fh;
my $tt = Template->new($config);
$tt->process('views/Users/add.html', $vars) or die $tt->error(); # this does not work
}
答案 0 :(得分:2)
Template Toolkit具有配置选项INCLUDE_PATH
,允许您设置一个或多个目录,其中Template Toolkit可以查找模板文件。如果设置include_path变量,而不是将路径放在$tt->process()
指令中,则可以在全局配置中设置路径,而不是在每个$tt->process()
指令中硬编码路径,或者必须使用{{ 1}}或ABSOLUTE
选项。您可以在RELATIVE
中指定多个目录,并使用子例程生成包含路径,因此您不必将所有模板保留在一个目录中。
因此我将配置和流程指令更改为以下内容:
INCLUDE_PATH
INCLUDE_PATH
上的文档包含有关此设置选项的完整信息。
请注意,您收到的错误与每个模板中自动包含的文件my $config = {
INTERPOLATE => 1, # expand "$var" in plain text
POST_CHOMP => 1, # cleanup whitespace
PRE_PROCESS => 'header', # prefix each template
EVAL_PERL => 1, # evaluate Perl code blocks
INCLUDE_PATH => [ "/srv/http/perlweb/views/Users/",
"/wherever/header/is",
\&my_cool_sub_to_generate_a_path_on_the_fly ]
};
my $tt = Template->new($config);
$tt->process('add.html', $vars) or die $tt->error();
有关 - 请确保您的目录位于header
。