Mojolicious模板渲染(五)
一、渲染内联模板
有些渲染器,如ep,允许模板内联传递。
$c->render(inline => 'The result is <%= 1 + 1 %>.');
由于自动检测依赖于路径,所以可能还需要提供一个处理程序。
$c->render(inline => "<%= shift->param('foo') %>", handler => 'epl');
二、渲染文本
stash关键字text可以将字节通过Mojolicious::Renderer的encoding方法编码后发回给浏览器:
$c->render(text => 'I ♥ Mojolicious!');
三、渲染数据
stash关键data可以将字节不经编码直接返回给浏览器:
$c->render(data => $bytes);
四、渲染JSON
stash关键字json可以将Perl语言的散列、数组等数据结构自动解析为json对象:
$c->render(json => {foo => [1, 'test', 3]});
五、http状态码
stash关键字status可以修改response中的状态码:
$c->render(text => 'Oops.', status => 500);
六、Content type
Response响应的Content-Type头实际上基于stash关键字format的MIME类型映射:
# Content-Type: text/plain
$c->render(text => 'Hello.', format => 'txt');
# Content-Type: image/png
$c->render(data => $bytes, format => 'png');
通过mojolicious的types方法可以扩展自定义MIME类型:
# 增加新的MIME类型
$app->types->type(md => 'text/markdown');
七、stash data
任何Perl语言的数据结构,都可以通过mojolicious::controller的stash方法传递到template中:
$c->stash(description => 'web framework');
$c->stash(frameworks => ['Catalyst', 'Mojolicious']);
$c->stash(spinoffs => {minion => 'job queue'});
%= $description
%= $frameworks->[1]
%= $spinoffs->{minion}
perl语言的各种控制结构也可以在模板中操作stash传递来的值:
$c->stash(description => 'web framework');
$c->stash(frameworks => ['Catalyst', 'Mojolicious']);
$c->stash(spinoffs => {minion => 'job queue'});
%= $description
%= $frameworks->[1]
%= $spinoffs->{minion}
对于可能以不同方式呈现的模板,当你不确定是否会设置stash值时,可以使用Mojolicious::Plugin::DefaultHelpers中的helper——stash来判断传递的变量是否存在:
% if (my $spinoffs = stash 'spinoffs') {
Minion is a <%= $spinoffs->{minion} %>.
% }