Mojolicious模板渲染(十五)

一、自定义响应

大多数响应内容,无论是静态的还是动态的,都是通过Mojo::Asset::File和Mojo::Asset::Memory对象提供的。对于一些静态内容,比如缓存的JSON数据或临时文件,我们可以使用Mojolicious::Plugin::DefaultHelpers中的“reply->asset”来向前端提供这些内容,同时允许设置Range、If-Modified-Since和If-None-Match头。

use Mojolicious::Lite -signatures;
use Mojo::Asset::File;
 
get '/leak' => sub ($c) {
  $c->res->headers->content_type('text/plain');
  $c->reply->asset(Mojo::Asset::File->new(path => '/etc/passwd'));
};
 
app->start;

为了获得更多的控制,我们也可以跳过helper,使用Mojolicious::Controller中的“rendering”来告诉渲染器我们何时生成了响应。

use Mojolicious::Lite -signatures;
use Mojo::Asset::File;
 
get '/leak' => sub ($c) {
  $c->res->headers->content_type('text/plain');
  $c->res->content->asset(Mojo::Asset::File->new(path => '/etc/passwd'));
  $c->rendered(200);
};
 
app->start;

二、开发自己的helper插件

我们可以把helper插件进行二次开发,借助plugin插件方法,把代码整合,方便我们开发其他web应用时再次调用。

package Mojolicious::Plugin::DebugHelper;
use Mojo::Base 'Mojolicious::Plugin', -signatures;
 
sub register ($self, $app, $conf) {
  $app->helper(debug => sub ($c, $str) {
    $c->app->log->debug($str);
  });
}
 
1;

register方法将在加载插件时被调用。我们可以用Mojolicious中helper方法,把helper加入到应用中。

use Mojolicious::Lite -signatures;
 
plugin 'DebugHelper';
 
get '/' => sub ($c) {
  $c->debug('It works!');
  $c->render(text => 'Hello!');
};
 
app->start;

标签