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} %>.
% }

标签