Mojolicus::控制器-控制器基类
#控制器包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->匹配(Mojolicus::Routes::match->new);
当前请求的路由器结果,默认为Mojolicious::路由::匹配对象。
#反思my$name=$c->match->endpoint->name;我的$foo=$c->match->endpoint->pattern->defaults->{foo};我的$action=$c->match->stack->[-1]{action};
我的$tx=$c->tx;$c=$c->tx(Mojo::事务::HTTP->new);
当前正在处理的事务,通常是Mojo::Transaction::HTTP或Mojo::Transaction::WebSocket对象。请注意,该属性被削弱了。因此,当您执行非阻塞操作时,也需要在其他地方引用该对象,并且底层连接可能会提前关闭。
#检查同行信息我的$address=$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('fo');
类似“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::DefaultHelpers和Mojolicious::插件::TagHelpers.
#确保使用“title”助手而不是控制器方法$c->helpers->title(“欢迎!”);#使用嵌套的帮助器而不是“reply”控制器方法$c->helpers->reply->not_found;
我的$cb=$c->on(finish=>sub{…});
订阅的事件“tx”,通常是Mojo::Transaction::HTTP或Mojo::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('foo');$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('fo');#仅上传文件我的$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->render(text=>“你好!”);my$bool=$c->render(json=>{foo=>‘bar’});my$bool=$c->render(handler=>“something”);my$bool=$c->render('foo/index');
使用渲染内容Mojolicus中的“渲染器”并发射吊钩Mojolicious中的“before_render”以及Mojolicious中的“after_render”或在无法生成响应的情况下死亡。所有其他键/值对都合并到“隐藏”.
#渲染角色$c->render(文本=>'I♥ “莫名其妙!”);#渲染角色(可选)$c->stash(文本=>'I♥ Mojolicious!”)->提供;#渲染二进制数据使用Mojo::JSON qw(encode_JSON);$c->render(data=>encode_json({test=>'I♥ Mojolicious!“});#呈现JSON$c->render(json=>{test=>'I♥ “莫名其妙!”});#渲染内联模板$c->渲染(inline=>“<%=1+1%>”);#渲染模板“foo/bar.html.ep”$c->render(模板=>“foo/bar”,格式=>“html”,处理程序=>“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_toString('foo/index',format=>'pdf');
尝试呈现内容并将其包装在Mojo::ByteStream对象或返回未定义
,所有参数都会自动本地化,并且仅在此呈现操作期间可用,使用的参数与“渲染”.
#渲染内联模板my$two=$c->render_to_string(inline=>“<%=1+1%>”);
$c=$c->渲染;$c=$c->渲染(302);
完成响应并发出挂钩Mojolicus中的“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;我的$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->发送($chars=>sub($c){…});
通过WebSocket非阻塞地发送消息或帧,写入所有数据后将执行可选的排出回调。此方法将使用101
响应状态,以建立WebSocket连接。
#发送“文本”消息$c->发送('I♥ “莫名其妙!”);#以“文本”消息形式发送JSON对象$c->发送({json=>{test=>‘I♥ Mojolicus!'}});#将JSON对象作为“二进制”消息发送使用Mojo::JSON qw(encode_JSON);$c->send({binary=>encode_json({test=>'I♥ Mojolicious!“})});#发送“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->stash;我的$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=>'test',bar=>23);
我的$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_fo('/index.html')->query(foo=>'bar');#“/myapp/index.html?foo=bar”如果应用程序部署在“/myaapp”下$c->url_fo('/index.html')->query(foo=>'bar');
您还可以使用助手Mojolicious::Plugin::DefaultHelpers中的“url_with”从当前请求继承查询参数。
#“/list?q=mojo&page=2”如果当前请求是“/lists?q=mojo&page=1”$c->url_with->query({page=>2});
my$url=$c->url_for_asset('/app.js');
生成便携式Mojo::URL带有静态资源基的对象。
我的$url=$c->url_for_file('/index.html');
生成便携式Mojo::URL对象的基为静态文件。
$c=$c->写入;$c=$c->写入(“”);$c=$c->写入($字节);$c=$c->write($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::DefaultHelpers和Mojolicious::插件::TagHelpers.
#呼叫助手$c->布局(“绿色”);$c->title(“欢迎!”);#较长版本$c->helpers->layout(“绿色”);
Mojolicious公司,Mojolicious::指南,https://mojolicious.org.