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;

标签