我正在尝试创建一个对我的设计师来说非常灵活的Catalyst应用程序。我的意思是,如果他们需要添加一个带有静态内容的新页面,我不必Catalyst
在他们为页面创建模板之前进入并添加该操作。我有它,如果他们添加任何名为 的模板name.html
,那么即使没有操作Catalyst
也可以显示该应用程序。目前我在 Root 控制器中有一个子程序,如下所示:http://www.domain.com/name.html
name
sub any_template :Regex('(.+)\.html$') {
my ($self, $c) = @_;
$c->stash(
template => $c->action . '.html',
);
}
这使得任何以“.html”结尾的请求都将查找该名称的模板。但是,如果为不存在的模板请求 url,则Template Toolkit会抛出一个错误,指出它无法呈现该模板,这是有道理的,因为它不存在。但是,如果模板不存在,我希望能够显示我的 404 not found 页面。是否有可能做到这一点?或者有没有人有更好的方法让你可以拥有模板页面,而不必向你的Catalyst
应用程序添加一个空操作?我知道可以使用 perl 的-e文件测试来查看文件系统上是否存在模板,但是有没有更好的方法呢?谢谢!
更新
这是我当前的包装器的样子:
[%
debug("Applying HTML page layout wrappers to $template.name\n");
content WRAPPER "$host/site/html" + "$host/site/layout";
-%]
这主要是由 TTSite 生成的。无论如何我可以做一些类似于 RET 建议的事情,如果失败,我可以使用 try catch 块来使用 404 页面?
更新
我已经尝试将我的包装模板更新为:
[%-
TRY;
content WRAPPER "$host/site/html" + "$host/site/layout";
CATCH file;
"File Error! $error.info";
CATCH;
"Error: $error.info!";
END;
-%]
找不到页面时会说有文件错误:
Couldn't render template test.html: file error - test.html: not found
但是,它不会进入我的任何一个 catch 块。我应该把它放在别的地方吗?
更新
模板工具包文档说:
Note that the DEFAULT option (disabled by default) allows you to specify a default
file to be used any time a template file can't be found. This will prevent file
exceptions from ever being raised when a non-existant file is requested (unless,
of course, the DEFAULT file your specify doesn't exist). Errors encountered once
the file has been found (i.e. read error, parse error) will be raised as file
exceptions as per usual.
这正是我正在寻找的,但没有如何使用它的示例。有谁知道如何使用该DEFAULT
选项?