Mojolicious模板渲染(十四)
一、模板继承
继承是对layout布局概念进一步扩展,Mojolicious::Plugin::DefaultHelpers中的helper “content”和Mojolicious::Plugin::DefaultHelpers中的”extends”允许我们用命名块构建框架模板,子模板可以覆盖这些块。
use Mojolicious::Lite;
# first > mylayout
get '/first' => {template => 'first', layout => 'mylayout'};
# third > second > first > mylayout
get '/third' => {template => 'third', layout => 'mylayout'};
app->start;
__DATA__
@@ layouts/mylayout.html.ep
<!DOCTYPE html>
<html>
<head><title>Hello</title></head>
<body><%= content %></body>
</html>
@@ first.html.ep
%= content header => begin
Default header
% end
<div>Hello World!</div>
%= content footer => begin
Default footer
% end
@@ second.html.ep
#继承first模板并覆盖了header块
% extends 'first';
% content header => begin
New header
% end
@@ third.html.ep
#继承seconde模板并覆盖了footer模板
% extends 'second';
% content footer => begin
New footer
% end
extends继承方法所形成的这个链可以不断延伸,以实现非常高水平的模板重用。
二、提供静态文件
静态文件可以使用Mojolicious::Static中的”paths”自动从应用程序的public文件夹中提供,或Mojolicious::Static中的”classes”在mojolicious应用的perl文件中使用DATA代码块提供。我们还可以通过Mojolicious::Plugin::DefaultHelpers中”reply->static”和在、Mojolicious::Plugin::DefaultHelpers中”reply->file”手动提供静态文件:
use Mojolicious::Lite -signatures;
get '/' => sub ($c) {
$c->reply->static('index.html');
};
get '/some_download' => sub ($c) {
$c->res->headers->content_disposition('attachment; filename=bar.png;');
$c->reply->static('foo/bar.png');
};
get '/leak' => sub ($c) {
$c->reply->file('/etc/passwd');
};
app->start;