模块:Mojolicious公司时间:控制器
起源:Mojo::基础

名称

Mojolicious::Controller-控制器基类

简介

#控制器包MyApp::控制器::Foo;使用Mojo::Base“Mojolicious::Controller”,-签名;#行动子栏($self){my$name=$self->param('name');$self->res->headers->cache_control('max-age=1,no-cache');$self->render(json=>{hello=>$name});}

描述

Mojolicious::控制器是您的基类Mojolicious公司控制器。它也是默认的控制器类,除非您设置Mojolicious中的“controller_class”.

属性

Mojolicious::控制器实现以下属性。

应用程序

我的$app=$c->app;$c=$c->app(Mojolicios->new);

返回到调度到此控制器的应用程序的引用,通常是Mojolicious公司对象。请注意,该属性被削弱了。

#使用应用程序记录器$c->app->log->debug(“Hello Mojo”);#生成路径my$path=$c->app->home->child('templates','foo','bar.html.ep');

比赛

我的$m=$c->匹配;$c=$c->match(Mojolicious::Routes::match->new);

当前请求的路由器结果,默认为Mojolicious::路由::匹配对象。

#反思my$name=$c->match->endpoint->name;我的$foo=$c->match->endpoint->pattern->defaults->{foo};我的$action=$c->match->stack->[-1]{action};

tx公司

我的$tx=$c->tx;$c=$c->tx(Mojo::Transaction::HTTP->new);

当前正在处理的事务,通常是Mojo::Transaction::HTTPMojo::Transaction::WebSocket对象。请注意,该属性被削弱了。因此,当您执行非阻塞操作时,也需要在其他地方引用该对象,并且底层连接可能会提前关闭。

#检查对等信息我的$地址=$c->tx->remote_address;我的$port=$c->tx->remote_port;#将WebSocket消息的大小限制增加到1600万B$c->tx->max_websocket_size(16777216),如果$c->tx->is_websoccket;#在不知道连接状态的情况下执行非阻塞操作我的$tx=$c->tx;Mojo::IOLoop->计时器(2=>sub{$c->app->log->debug($tx->is_finished?'已完成':'正在进行');});

方法

Mojolicious::控制器从继承所有方法Mojo::基础并实现了以下新功能。

持续

$c->继续;

从中间目的地继续调度链Mojolicious::Routes中的“continue”.

my$value=$c->cookie('foo');$c=$c->cookie(foo=>“bar”);$c=$c->cookie(foo=>“bar”,{path=>“/”});

访问请求cookie值并创建新的响应cookie。如果有多个值共享同一名称,并且您想访问不止一个值,可以使用“每个cookie”.

#创建包含域和到期日期的响应cookie$c->cookie(user=>'sri',{domain=>'example.com',expires=>time+60});#创建安全响应cookie$c->cookie(机密=>“I<3Mojolicious”,{secure=>1,httponly=>1});
my$values=$c->every_cookie('foo');

类似“饼干”,但返回与数组引用同名的所有请求cookie值。

$获取第一个cookie值我的$first=$c->每个cookie('foo')->[0];

每个参数

my$values=$c->every_param('foo');

类似“参数”,但返回与数组引用同名的所有值。

#获取第一个值my$first=$c->every_param('foo')->[0];
my$values=$c->every_signed_cookie('foo');

类似“signed_cookie”,但返回与数组引用同名的所有签名请求cookie值。

#获取第一个签名的cookie值我的$第一个=$c->every_signed_cookie('foo')->[0];

完成

$c=$c->完成;$c=$c->完成(1000);$c=$c->finish(1003=>“无法接受数据!”);$c=$c->完成(“再见!”);

正常关闭WebSocket连接或长轮询流。此方法将使用101响应状态,以建立WebSocket连接。

助手

我的$helpers=$c->helpers;

返回一个代理对象,该代理对象包含当前控制器对象以及“应用程序”可以调用。这包括来自的所有助手Mojolicious::Plugin::DefaultHelpersMojolicious::插件::TagHelpers.

#确保使用“title”助手而不是控制器方法$c->helpers->title(“欢迎!”);#使用嵌套的帮助器而不是“reply”控制器方法$c->helpers->reply->not_found;

我的$cb=$c->on(finish=>sub{…});

订阅的事件“tx”,通常是Mojo::Transaction::HTTPMojo::Transaction::WebSocket对象。此方法将使用101响应状态,以建立WebSocket连接。

#交易完成后做点什么$c->打开(完成=>子($c){$c->app->log->debug(“所有数据都已发送”);});#接收WebSocket消息$c->打开(消息=>sub($c,$msg){$c->app->log->debug(“消息:$msg”);});#通过WebSocket消息接收JSON对象$c->on(json=>sub($c,$hash){$c->app->log->debug(“测试:$hash->{Test}”);});#接收WebSocket“二进制”消息上的$c->(二进制=>sub($c,$bytes){my$len=长度$bytes;$c->app->log->debug(“已接收$len字节”);});

参数

my$value=$c->param('fo');$c=$c->param(foo=>'ba;r');$c=$c->param(foo=>'ba;r','baz');$c=$c->param(foo=>['ba;r','baz']);

访问非保留存储值的路由占位符值、文件上载以及GET(获取)邮政从查询字符串中提取的参数和应用程序/x-www-form-urlencoded多部分/表单数据消息正文,按此顺序。如果有多个值共享同一名称,并且您想访问不止一个值,可以使用“every_param”。需要将请求正文的部分加载到内存中以进行解析邮政参数,所以您必须确保它不是太大。默认情况下,请求的大小限制为16MiB。

#获取第一个值my$first=$c->every_param('foo')->[0];

为了获得更多控制,您还可以直接访问请求信息。

#仅GET参数my$foo=$c->req->query_params->param('foo');#仅POST参数my$foo=$c->req->body_params->param('foo');#仅GET和POST参数my$foo=$c->req->param('foo');#仅上传文件我的$foo=$c->req->上传('foo');

提供

我的$bool=$c->渲染;我的$bool=$c->render(foo=>'bar',baz=>23);my$bool=$c->render(template=>'foo/index');my$bool=$c->render(template=>“index”,format=>“html”);我的$bool=$c->render(数据=>$bytes);my$bool=$c->渲染(text=>“你好!”);我的$bool=$c->render(json=>{foo=>'bar'});my$bool=$c->render(handler=>“something”);my$bool=$c->render('foo/index');

使用渲染内容Mojolicious中的“渲染器”并发射吊钩Mojolicious中的“before_render”以及Mojolicious中的“after_render”或在无法生成响应时死亡。所有其他键/值对都合并到“藏匿”.

#渲染角色$c->渲染(文本=>'I“莫名其妙!”);#渲染角色(可选)$c->stash(文本=>'IMojolicious!”)->提供;#渲染二进制数据使用Mojo::JSON qw(encode_JSON);$c->render(data=>encode_json({test=>'IMojolicious!“});#呈现JSON$c->render(json=>{test=>'I“莫名其妙!”});#渲染内联模板$c->渲染(inline=>“<%=1+1%>”);#呈现模板“foo/bar.html.ep”$c->render(template=>“foo/bar”,format=>“html”,handler=>“ep”);#使用任意值“foo”和“bar”渲染模板“test.*.*”$c->render(template=>“test”,foo=>“测试”,bar=>23);#呈现模板“test.xml.*”$c->render(template=>“test”,format=>“xml”);#呈现模板“test.xml.*”(可选)$c->render('test',format=>'xml');

渲染_稍后

$c=$c->render_later;

禁用自动呈现以延迟响应生成,只有在自动呈现会导致响应时才需要。

#延迟渲染$c->render_later;Mojo::IOLoop->timer(2=>sub{$c->render(text=>'延迟2秒!')});

渲染器_可能

我的$bool=$c->render_maybe;my$bool=$c->render_maybe(foo=>'bar',baz=>23);my$bool=$c->render_maybe('foo/index',format=>'html');

尝试呈现内容,但不要调用Mojolicious::Plugin::DefaultHelpers中的“reply->not_found”如果无法生成响应,则所有参数都会自动本地化,并且仅在此呈现操作期间可用,使用与相同的参数“渲染”.

#仅当模板“index_local”存在时才渲染该模板$c->render_maybe('index_local')或$c->render('index’);

渲染到字符串

my$output=$c->render_to_string('fo/index',format=>'pdf');

尝试呈现内容并将其包装在Mojo::ByteStream对象或返回未定义,所有参数都会自动本地化,并且仅在此呈现操作期间可用,使用的参数与“渲染”.

#渲染内联模板my$two=$c->render_to_string(inline=>“<%=1+1%>”);

提供

$c=$c->渲染;$c=$c->渲染(302);

完成响应并发出挂钩Mojolicious中的“after_dispatch”,默认为使用200响应代码。

#自定义响应$c->res->headers->content_type('text/plain');$c->res->body(“你好,世界!”);$c->渲染(200);

请求

我的$req=$c->req;

获取Mojo::消息::请求对象来自“tx”.

#较长版本我的$req=$c->tx->req;#提取请求信息我的$id=$c->req->request_id;my$method=$c->req->方法;我的$url=$c->req->url->to_abs;my$info=$c->req->url->to_abs->userinfo;my$host=$c->req->url->to_abs->host;我的$agent=$c->req->headers->user_agent;my$custom=$c->req->headers->header(“自定义标题”);my$bytes=$c->req->body;我的$str=$c->req->text;我的$hash=$c->req->params->tohash;我的$all=$c->req->上传;my$value=$c->req->json;我的$foo=$c->req->json('/23/foo');我的$dom=$c->req->dom;my$bar=$c->req->dom('div.bar')->first->text;

物件

我的$res=$c->res;

获取Mojo::消息::响应对象来自“tx”.

#较长版本我的$res=$c->tx->res;#通过设置响应标头强制文件下载$c->res->headers->content_disposition('attachment;filename=foo.png;');#使用自定义响应标头$c->res->headers->header(“自定义标题”=>“任何”);#确保正确缓存响应$c->res->headers->cache_control('public,max-age=300');$c->res->headers->append(变量=>“接受编码”);

发送

$c=$c->send({binary=>$bytes});$c=$c->发送({text=>$bytes});$c=$c->send({json=>{test=>[1,2,3]}});$c=$c->send([$fin,$rsv1,$rsv2,$rsv3,$op,$payload]);$c=$c->发送($chars);$c=$c->send($chars=>sub($c){…});

通过WebSocket非阻塞地发送消息或帧,写入所有数据后将执行可选的排出回调。此方法将使用101响应状态,以建立WebSocket连接。

#发送“文本”消息$c->发送('I“莫名其妙!”);#以“文本”消息形式发送JSON对象$c->send({json=>{test=>'IMojolicious!“}});#将JSON对象作为“二进制”消息发送使用Mojo::JSON qw(encode_JSON);$c->send({binary=>encode_json({test=>'IMojolicious!“})});#发送“Ping”帧使用Mojo::WebSocket qw(WS_PING);$c->send([1,0,0,0,WS_PING,“你好,世界!”]);#继续之前,请确保已写入第一条消息$c->send(‘第一条消息!’=>sub($c){$c->send(‘第二条消息!')});

对于大多数空闲的WebSocket,您可能还希望使用Mojolicious::Plugin::DefaultHelpers中的“activity_timeout”,通常默认为30秒。

#将连接的非活动超时时间增加到300秒$c->activity_timeout(300);

阶段

我的$session=$c->session;我的$foo=$c->会话('foo');$c=$c->会话({foo=>“bar”});$c=$c->会话(foo=>“bar”);

为接下来的几个请求提供持久数据存储,所有会话数据都用序列化Mojo::JSON并将Base64编码存储在HMAC-SHA256签名Cookie中,以防止篡改。请注意,Cookie通常具有4096字节(4KiB)限制,具体取决于浏览器。

#操纵会话$c->session->{foo}='bar';我的$foo=$c->session->{foo};删除$c->session->{foo};#从现在起以秒为单位的到期日期(在请求之间持续)$c->会话(过期=>604800);#过期日期作为绝对纪元时间(仅对一个请求有效)$c->会话(过期=>时间+604800);#通过设置过去的到期日期删除整个会话$c->会话(过期=>1);
my$value=$c->signed_cookie('foo');$c=$c->signed_cookie(foo=>'bar');$c=$c->signed_cookie(foo=>“bar”,{path=>“/”});

访问签名请求cookie值并创建新的签名响应cookie。如果有多个值共享同一名称,并且您想访问不止一个值,可以使用“每个签名cookie”。Cookie使用HMAC-SHA256进行加密签名,以防止篡改,签名验证失败的Cookie将被自动丢弃。

藏匿

我的$hash=$c->存储;我的$foo=$c->stash('foo');$c=$c->stash({foo=>'bar',baz=>23});$c=$c->stash(foo=>“bar”,baz=>23);

对于当前请求的非持久数据存储和交换,可以使用设置应用程序范围的默认值Mojolicious中的“默认值”。一些存储值具有特殊含义并被保留,完整列表当前为行动,应用程序,哥伦比亚广播公司,控制器,数据,延伸,格式,处理程序,内联,杰森,布局,命名空间,路径,地位,模板,文本变体。请注意,所有存储值都带有魔力*前缀保留供内部使用。

#删除值我的$foo=删除$c->stash->{foo};#一次分配多个值$c->stash(foo=>“测试”,bar=>23);

url用于

我的$url=$c->url_for;我的$url=$c->url_for(名称=>“sebastian”);我的$url=$c->urlfor({name=>'sebastian'});我的$url=$c->url_for('test',name=>'sebastian');我的$url=$c->url_for('test',{name=>'sebastian'});我的$url=$c->url_for('/index.html');my$url=$c->url_for(“//example.com/index.html”);我的$url=$c->url_for('http://example.com/index.html');我的$url=$c->url_for('邮件地址:sri@example.com');我的$url=$c->url_for(“#whatever”);

生成便携式Mojo::URL具有路径、URL或路由的基的对象。

#重建当前路由的URL$c->url_for;#重建当前路由的URL,但替换“name”占位符值$c->url_for(名称=>“sebastian”);#当前路由的绝对URL$c->url_for->to_abs;#使用两个占位符值为路由“test”构建URL$c->url_for('test',name=>'sebastian',foo=>'bar');# "http://127.0.0.1:3000/index.html“如果应用程序是用Morbo启动的$c->url_for('/index.html')->to_abs;# "https://127.0.0.1:443/index.html“如果应用程序是用Morbo启动的$c->url_for('/index.html’)->to_abs->scheme('https')->端口(443);#“/index.html?foo=bar”如果应用程序部署在“/”下$c->url_for('/index.html’)->查询(foo=>'bar');#“/myapp/index.html?foo=bar”如果应用程序部署在“/myaapp”下$c->url_for('/index.html’)->查询(foo=>'bar');

您还可以使用助手Mojolicus中的“url_with:”:插件::DefaultHelpers从当前请求继承查询参数。

#“/list?q=mojo&page=2”如果当前请求是“/lists?q=mojo&page=1”$c->url_with->query({page=>2});

用于资产的url

我的$url=$c->url_for_asset('/app.js');

生成便携式Mojo::URL具有静态资产基础的对象。

用于文件的url

我的$url=$c->url_for_file('/index.html');

生成便携式Mojo::URL对象的基为静态文件。

$c=$c->写入;$c=$c->写入(“”);$c=$c->写入($字节);$c=$c->写入($bytes=>sub($c){…});

非阻塞写入动态内容,写入所有数据后将执行可选的drain回调。在没有数据块的情况下调用此方法将最终确定响应标头,并允许稍后写入动态内容。

#保持连接活动(使用Content-Length标头)$c->res->headers->content_length(6);$c->write('Hel'=>sub($c){$c->write('lo!')});#完成后关闭连接(不带Content-Length标头)$c->write('Hel'=>sub($c){$c->write('lo!'=>sub($c){$c->finish});});

你可以打电话“完成”或随时写入空数据块以结束流。

HTTP/1.1 200正常日期:2014年9月13日星期六16:48:29 GMT内容长度:6服务器:Mojolicious(Perl)你好!HTTP/1.1 200正常连接:关闭日期:2014年9月13日星期六16:48:29 GMT服务器:Mojolicious(Perl)你好!

对于Comet(长轮询),您可能还想使用Mojolicious::Plugin::DefaultHelpers中的“activity_timeout”,通常默认为30秒。

#将连接的非活动超时时间增加到300秒$c->activity_timeout(300);

写入区块

$c=$c->写入区块;$c=$c->write_chunk('');$c=$c->写入区块($字节);$c=$c->write_chunk($bytes=>sub($c){…});

使用分块传输编码非阻塞地写入动态内容,写入所有数据后将执行可选的排出回调。在没有数据块的情况下调用此方法将最终确定响应标头,并允许稍后写入动态内容。

#继续之前,请确保已写入上一块$c->write_chunk('H'=>sub($c){$c->write_chunk('ell'=>sub($c){$c->finish('o!')});});

你可以打电话“完成”或随时写入空数据块以结束流。

HTTP/1.1 200正常日期:2014年9月13日星期六16:48:29 GMT传输编码:分块服务器:Mojolicious(Perl)1H(H)厄尔2哦!0

帮助

除了“属性”“方法”您还可以致电以下人员提供的助手“应用程序”Mojolicious::控制器物体。这包括来自的所有助手Mojolicious::Plugin::DefaultHelpersMojolicious::插件::TagHelpers.

#呼叫助手$c->布局(“绿色”);$c->title(“欢迎!”);#较长版本$c->helpers->layout(“绿色”);

另请参阅

Mojolicious公司,Mojolicious::指南,https://mojolicious.org.