Mojolicious模板渲染(四)
一、渲染模板
渲染器render可以自动的检测和加载模板。但是我们也可以在render的参数(官方文档称此参数为stash)中指定渲染器。对于参数中的每一个反斜杠前的字符串都会被翻译为一个子路径:
# foo/bar/baz.*.*
$c->render(template => 'foo/bar/baz');
除了template关键字,还可以设置format和handler关键字:
# foo/bar/baz.txt.epl
$c->render(template => 'foo/bar/baz', format => 'txt', handler => 'epl');
每一个mojolicious中的路由方法(即官方文档中所称的controller的action),都会返回一个模板渲染,render方法是经常调用的,它有一个简写:
$c->render('foo/bar/baz');
如果我们不确定controller的action返回的template是否真的存在,我们可以使用用Mojolicious::Controller的render_mybe方法:
$c->render_maybe('localized/baz') or $c->render('foo/bar/baz');
二、render_to_string方法
有时候,我们不需要返回reponse,而是希望直接呈现结果,比如说发送邮件:
my $html = $c->render_to_string('mail');
同时该方法也可以不进行编码,而把文件转换为二进制数据返回给浏览器:
my $pdf = $c->render_to_string('invoice', format => 'pdf');
$c->render(data => $pdf, format => 'pdf');
所有传递的参数都会自动本地化,并且只在渲染操作期间可用。
三、模板变量
现在很多网站都可以实现自适应——为电脑端和手机端返回不同的页面。我们可以借助stash关键字variable来对不同的终端进行适配:
# foo/bar/baz.html+phone.ep
# foo/bar/baz.html.ep
$c->render('foo/bar/baz', variant => 'phone');
使用了variable关键字,如果该名称的模板存在则返回,如果不存在返回通用的模板。