名称

Mojolicious::Guides::Tutorial-Mojolicous入门

辅导的

以示例为基础的快速介绍Mojolicious::精简。你在这里学到的几乎所有东西都适用于莫乔利奇应用。

这只是第一次Mojolicious::指南其他指南深入探讨了以下主题增长的Mojolicious::精简将原型转换为结构良好的莫乔利奇应用程序,路由,致使等等。我们强烈鼓励读者在阅读完本指南后继续阅读其余指南。

你好,世界

一个简单的Hello World应用程序可以如下所示,严格的,警告,utf8接口和Perl 5.16特征自动启用,并且功能导入,当您使用Mojolicuis::精简版,将脚本转换为功能齐全的web应用程序。

#!/usr/bin/env-perl使用Mojolicious::Lite签名;获取“/”=>子($c){$c->render(text=>“Hello World!”);};应用程序->启动;

使用Mojolicious::Command::Author::generate::lite_app还有一个helper命令用于生成一个小示例应用程序。

$mojo生成lite-app myapp.pl

命令

许多不同的命令从命令行自动可用。CGI和PSGI公司环境甚至可以被检测到,并且通常只在没有命令的情况下工作。

$ ./myapp.pl守护程序Web应用程序位于http://127.0.0.1:3000$ ./myapp.pl守护程序-l http://*:8080Web应用程序位于http://127.0.0.1:8080网址$ ./myapp.pl cgi…CGI输出。。。$ ./myapp.pl获取/你好,世界!$ ./我的应用程序.pl…可用命令列表(或自动检测到的环境)。。。

打电话给Mojolicious中的“start”(应用程序->启动)启动命令系统的,应该是应用程序中的最后一个表达式,因为它的返回值可能很重要。

#使用@ARGV拾取命令应用程序->启动;#启动“daemon”命令app->start('daemon','-l','http://*:8080');

重新加载

如果使用莫尔博开发web服务器,因此您不必在每次更改后重新启动服务器。

$莫博/我的应用程序.plWeb应用程序位于网址:http://127.0.0.1:3000

有关如何部署应用程序的更多信息,请参见Mojolicious::Guides::Cookbook中的“部署”.

路线

路由基本上只是一些奇特的路径,可以包含不同类型的占位符,如果它们与请求URL的路径部分匹配,通常会导致操作(加元)是一个Mojolicious::控制器对象,包含HTTP请求和响应。

使用Mojolicious::Lite签名;#指向呈现某些文本的操作的路由获取'/foo'=>sub($c){$c->render(text=>“你好,世界!”);};应用程序->启动;

响应内容通常由以下操作生成Mojolicious::Controller中的“render”,但稍后会详细介绍。

GET/POST参数

全部GET(获取)邮政与请求一起发送的参数可以通过访问Mojolicious::Controller中的“param”.

使用Mojolicious::Lite签名;#/foo?用户=sriget'/foo'=>子($c){my$user=$c->param(“用户”);$c->render(text=>“Hello$user.”);};应用程序->启动;

Stash和模板

这个Mojolicious::Controller中的“stash”用于将数据传递给模板,模板可以在数据第节。一些隐藏值,如模板,文本数据是保留的,将由使用Mojolicious::Controller中的“render”决定如何生成响应。

使用Mojolicious::Lite签名;#指向呈现模板的操作的路由获取'/foo'=>sub($c){$c->stash(一个=>23);$c->render(template=>'magic',two=>24);};应用程序->启动;__数据__@@魔术.html.ep神奇的数字是<%=$one%>和<%=$12%>。

有关模板的更多信息,请参见Mojolicus中的“嵌入式Perl”::指南::渲染.

超文本传输协议

Mojolicious::Controller中的“req”Mojolicious::Controller中的“res”允许您完全访问所有HTTP功能和信息。

使用Mojolicious::Lite签名;#访问请求信息获取“/agent”=>sub($c){my$host=$c->req->url->to_abs->host;我的$ua=$c->req->headers->user_agent;$c->render(text=>“$ua的请求已到达$host。”);};#回显请求正文并发送带有响应的自定义标头post“/echo”=>sub($c){$c->res->headers->header(“X-Bender”=>“咬我闪亮的金属屁股!”);$c->render(数据=>$c->req->body);};应用程序->启动;

您可以直接从命令行使用测试更高级的示例Mojolicious::Command::get.

$ ./myapp.pl获取-v-M POST-c“测试”/echo

JSON语言

JSON是web服务最常用的数据交换格式。莫乔利奇喜欢JSON,并提供了可能最快的pure-Perl实现Mojo::JSON内置,可通过Mojo::Message中的“json”以及保留的存储值杰森.

使用Mojolicious::Lite签名;#修改收到的JSON文档并返回put“/reverse”=>sub($c){我的$hash=$c->req->json;$hash->{message}=反向$hash->{message};$c->render(json=>$hash);};应用程序->启动;

您可以使用从命令行发送JSON文档Mojolicious::Command::get.

$ ./myapp.pl get-MPUT-c'{“message”:“你好,Mojo!”}'/reverse

内置异常页和not_found页

在开发过程中,每当您出错时,都会遇到这些页面,它们非常漂亮,包含大量有价值的信息,有助于您调试应用程序。

使用Mojolicious::Lite签名;#未找到(404)获取'/missing'=>子($c){$c->render(模板=>“does_not_exist”);};#例外情况(500)get'/dies'=>sub{die'故意错误'};应用程序->启动;

您甚至可以将CSS选择器与Mojolicious::Command::get只提取你真正感兴趣的信息。

$ ./myapp.pl获取/dies“#error”

不要担心在这些页面上显示太多信息,它们只在开发期间可用,并将自动替换为在生产环境中不显示任何敏感信息的页面。

路线名称

所有路由都可以有与其关联的名称,这允许自动模板检测和反向引用Mojolicious::Controller中的“url_for”,许多方法和助手都喜欢Mojolicious::Plugin::TagHelpers中的“link_to”依赖。

使用Mojolicious::Lite签名;#渲染模板“index.html.ep”获取“/”=>子($c){$c->渲染;}=>“索引”;#呈现模板“hello.html.ep”获取“/hello”;应用程序->启动;__数据__@@索引.html.ep<%=link_to Hello=>“你好”%>。<%=link_to Reload=>“索引”%>。@@你好.html.ep你好,世界!

无名路由得到一个自动生成的分配,该分配仅等于路由本身,没有非单词字符。

布局

模板也可以有布局,只需使用帮助器选择一个即可Mojolicious::Plugin::DefaultHelpers中的“布局”并使用助手放置当前模板的结果Mojolicious::Plugin::DefaultHelpers中的“内容”.

使用Mojolicuis::Lite;获取'/with_layout';应用程序->启动;__数据__@@使用_layout.html.ep%标题“绿色”;%布局“绿色”;你好,世界!@@布局/green.html.ep<!DOCTYPE html><html><head><title><%=title%></title></head><body><%=内容%></body></html>

藏匿物或帮手Mojolicious::Plugin::DefaultHelpers中的“title”可用于向布局传递附加数据。

阻碍

模板块可以像普通Perl函数一样使用,并且始终由开始结束关键字,它们是许多助手的基础。

使用Mojolicious::Lite;获取'/with_block'=>'block';应用程序->启动;__数据__@@块.html.ep%my$link=开始%my($url,$name)=@_;尝试<%=link_to$url=>begin%><%=$name%><%end%>。%结束<!DOCTYPE html><html>塞巴斯蒂安框架<body>%=$link->('http://mojolicious.org','嘲讽')%=$link->('http://mojojs.org','mojo.js')</body></html>

助手

助手是可以使用关键字创建的小函数Mojolicious::Lite中的“helper”并在整个应用程序中重用,从操作到模板。

使用Mojolicious::Lite签名;#识别访客的助手助手whois=>sub($c){my$agent=$c->req->headers->user_agent||“匿名”;我的$ip=$c->tx->remote_address;返回“$agent($ip)”;};#在操作和模板中使用助手获取“/secret”=>sub($c){我的$user=$c->whois;$c->app->log->debug(“来自$user的请求”);};应用程序->启动;__数据__@@secret.html网址我们知道你是谁。

可以在中找到所有内置的列表Mojolicious::Plugin::DefaultHelpersMojolicious::插件::TagHelpers.

插件

插件是帮助代码共享和组织的应用程序扩展。您可以使用关键字加载插件Mojolicious::Lite中的“插件”,可以省略Mojolicious::插件::名称的一部分,并可选地提供插件的配置。

使用Mojolicious::Lite;插件配置=>{file=>'/etc/myapp.conf',默认值=>{foo=>'bar'}};#返回配置的foo值,如果没有配置文件则返回默认值获取'/foo'=>sub($c){我的$foo=$c->app->config('foo');$c->render(json=>{foo=>$foo});};应用程序->启动;

Mojolicious::插件::配置是一个内置插件,可以填充Mojolicious中的“config”使用配置文件。插件还可以设置路由、挂钩、处理程序,甚至加载其他插件。内置插件列表位于Mojolicious::PLUGINS中的“PLUGINS”,以及更多可用的CPAN公司.

占位符

路由占位符允许捕获请求路径的一部分,直到/.出现分隔符,类似于正则表达式([^/.]+)。可以通过以下方式访问结果Mojolicuis::控制器中的“隐藏”Mojolicious::Controller中的“param”.

使用Mojolicious::Lite签名;#/foo/test#/foo/test123获取“/foo/:bar”=>sub($c){我的$bar=$c->stash('bar');$c->render(text=>“我们的:bar占位符匹配$bar”);};#/testsomething/foo#/test123something/fooget'/<:bar>something/foo'=>sub($c){我的$bar=$c->param('bar');$c->render(text=>“我们的:bar占位符匹配$bar”);};应用程序->启动;

要将它们与周围的文本分开,可以用<>,这也使得冒号前缀是可选的。

放松占位符

松弛占位符允许匹配所有内容,直到/发生,类似于正则表达式([^/]+).

使用Mojolicious::Lite;#/你好/测试#/hello/test.html获取'/hello/#you'=>'groovy';应用程序->启动;__数据__@@groovy.html.ep版您的名字是<%=$you%>。

通配符占位符

通配符占位符允许绝对匹配所有内容,包括/.,类似于正则表达式(.+).

使用Mojolicious::Lite;#/hello/test(你好/测试)#/hello/test123#/你好/test.123/test/123获取'/hello/*you'=>'groovy';应用程序->启动;__数据__@@groovy.html.ep版您的名字是<%=$you%>。

HTTP方法

路由可以限制为具有不同关键字的特定请求方法,如Mojolicious::Lite中的“get”Mojolicious::Lite中的“any”.

使用Mojolicious::Lite签名;#GET/hello(获取/问候)获取'/hello'=>sub($c){$c->render(text=>“你好,世界!”);};#PUT/你好put“/hello”=>sub($c){my$size=length$c->req->body;$c->render(text=>“您向/hello上传了$size字节。”);};#获取|发布|补丁/再见any['GET','POST','PATCH']=>'/bey'=>sub($c){$c->render(text=>“再见!”);};#*/随便任何“/任何”=>子($c){my$method=$c->req->方法;$c->render(text=>“您用$method调用了/anything。”);};应用程序->启动;

可选占位符

所有占位符都需要一个值,但通过为它们分配默认值,可以使捕获成为可选的。

使用Mojolicious::Lite签名;#/你好#/你好/萨拉get'/hello/:name'=>{name=>'Sebastian',day=>'Monday'}=>sub($c){$c->render(模板=>“groovy”,格式=>“txt”);};应用程序->启动;__数据__@@groovy.txt.ep版我的名字是<%=$name%>,它是<%=$day%>。

不属于占位符的默认值会一直合并到存储中。

限制性占位符

使占位符更具限制性的一个非常简单的方法是替代方法,您只需列出可能的值。

使用Mojolicious::Lite签名;#/测试# /123任何“/:foo”=>[foo=>['test','123']]=>子($c){my$foo=$c->param('foo');$c->render(text=>“Our:foo占位符匹配$foo”);};应用程序->启动;

所有占位符都在内部编译为正则表达式,此过程也可以自定义。只需确保不要使用^$,或捕获组(...),非捕获组(?:...)但都很好。

使用Mojolicious::Lite签名;# /1# /123任何“/:bar”=>[bar=>qr/\d+/]=>sub($c){我的$bar=$c->param('bar');$c->render(text=>“我们的:bar占位符匹配$bar”);};应用程序->启动;

您可以使用命令仔细查看所有生成的正则表达式Mojolicious::Command::routes.

$ ./myapp.pl路由-v

低于

通过生成路由,可以轻松实现多个路由之间的身份验证和代码共享Mojolicious::Lite中的“under”。只有当回调返回真值时,才会评估以下所有路由。

使用Mojolicious::Lite签名;#基于名称参数进行身份验证子项下($c){#已验证身份my$name=$c->param('name')|'';如果$name eq'Bender',则返回1;#未验证$c->render(模板=>“拒绝”);返回undef;};#仅在身份验证时到达获取“/”=>“索引”;应用程序->启动;__数据__@@否认。html.ep你不是本德,被拒绝了。@@索引.html.ep你好,本德。

预混合多条路线是它的另一个好用途。

使用Mojolicious::Lite;#/foo个在“/foo”下;#/foo/bar获取'/bar'=>{text=>'foo-bar'};#/foo/baz获取'/baz'=>{text=>'foo-baz'};#/(重置)在“/”=>{msg=>“whatever”}下;#/巴获取“/bar”=>{inline=>“<%=$msg%>有效”};应用程序->启动;

您还可以使用将相关路线分组Mojolicious::Lite中的“group”,它允许嵌套使用生成的路由Mojolicious::Lite中的“under”.

使用Mojolicus::Lite-签名;#所有路由共享的全局逻辑子项下($c){如果$c->req->headers->header('X-Bender'),则返回1;$c->render(text=>“你不是Bender”);返回undef;};#管理部分组{#仅由该组中的路由共享的本地逻辑在“/admin”=>sub($c)下{如果$c->req->headers->headers('X-Awesome'),则返回1;$c->render(text=>“你还不够棒。”);返回undef;};#GET/admin/仪表板get'/dashboard'=>{text=>'这里还没有看到任何内容。'};};#获取/欢迎get'/welcome'=>{text=>'Hi Bender.'};应用程序->启动;

格式

可以从文件扩展名中自动检测格式,如.html格式,它们用于查找正确的模板并生成正确的内容类型收割台。使用限制性占位符声明可能的值。

使用Mojolicus::Lite-签名;#/检测.html#/检测.txtget'/detection'=>[format=>['html,'txt']]=>sub($c){$c->render(模板=>“检测到”);};应用程序->启动;__数据__@@检测到.html.ep<!DOCTYPE html><html><head><title>检测到</title><body>检测到HTML</车身></html>@@检测到.txt.ep检测到TXT。

就像占位符一样,您可以使用默认值使格式可选。

使用Mojolicious::Lite签名;#/你好#/hello.json(你好.json)#/hello.txt(你好.txt)get'/hello'=>[格式=>['json','txt']]=>{格式=>'txt'}=>子($c){如果$c->stash('format')eq'json',则返回$c->render(json=>{hello=>'world'});$c->render(text=>“hello world”);};应用程序->启动;

默认格式为html格式渲染器将在必要时回退到。

内容协商

对于具有不同表示形式且需要真正RESTful内容协商的资源,您还可以使用Mojolicious::Plugin::DefaultHelpers中的“respond_to”.

使用Mojolicious::Lite签名;#/hello(接受:application/json)#/hello(接受:application/xml)#/hello.json(你好.json)#/hello.xml#/你好_格式=json#/你好_format=xmlget'/hello'=>[格式=>['json','xml']]=>{格式=>不设防}=>sub($c){$c->响应(json=>{json=>{hello=>“世界”}},xml=>{text=>'<hello>world</hello>'},任意=>{数据=>“”,状态=>204});};应用程序->启动;

MIME类型映射可以用Mojolicious中的“类型”.

app->types->type(rdf=>“application/rdf+xml”);

静态文件

与模板类似,但只有一个文件扩展名和可选的Base64编码,静态文件可以在数据分区和自动送达。

使用Mojolicious::Lite;应用程序->启动;__数据__@@一些东西.js警报(“你好!”);@@test.txt(base64)dGVzdCAxMjMKbGFsYWxh公司

外部静态文件不限于单个文件扩展名,将从公众的目录(如果存在)。

$mkdir公用$mv something.js公共/something.js$mv mojolicious.tar.gz public/mojolicieous.tar.gz

两者的优先级都高于路由GET(获取)头部请求。与进行内容协商范围,If-无匹配If-修改自标头也受支持,可以很容易地用Mojolicious::Command::get.

$ ./myapp.pl get/something.js-v-H'范围:字节=2-4'

外部模板

渲染器将在模板目录(如果存在)。

$mkdir-p模板/foo$echo“你好,世界!”>模板/foo/bar.html.ep

它们的优先级高于中的模板数据第节。

使用Mojolicious::Lite签名;#渲染模板“templates/foo/bar.html.ep”任何“/外部”=>子($c){$c->render(模板=>“foo/bar”);};应用程序->启动;

主页

你可以使用Mojolicious中的“家”与您的应用程序视为其主目录的目录进行交互。这是它要搜索的目录公众的模板目录,但您可以使用它存储各种特定于应用程序的数据。

$mkdir缓存$echo“你好,世界!”>缓存/hello.txt

有很多有用的方法Mojo::主页继承自Mojo::文件,比如Mojo::File中的“child”Mojo::File中的“slurp”,这将帮助您保持应用程序在许多不同的操作系统之间的可移植性。

使用Mojolicious::Lite签名;#将消息加载到内存my$hello=app->home->child('cache','hello.txt')->slurp;#显示消息获取“/”=>子($c){$c->render(文本=>$hello);};

您还可以从命令行使用Mojolicious::命令::eval.

$ ./myapp.pl eval-v“应用程序->主页”

条件

条件,如代理人主办Mojolicious::插件::HeaderCondition允许更强大的路由构造。

使用Mojolicious::Lite签名;#Firefox浏览器获取'/foo'=>(代理=>qr/Firefox/)=>sub($c){$c->render(text=>“恭喜,您使用的浏览器很酷。”);};#Internet Explorer(Internet Explorer)获取“/foo”=>(代理=>qr/Internet Explorer/)=>sub($c){$c->render(text=>“伙计,你真的需要升级到Firefox。”);};# http://mojolicious.org/barget'/bar'=>(host=>'mojolicious.org')=>sub($c){$c->render(text=>“你好,Mojolicious.”);};应用程序->启动;

会议

一旦您通过帮助器开始使用基于Cookie的会话,它们就会立即生效Mojolicious::Plugin::DefaultHelpers中的“session”。请注意,所有会话数据都使用序列化Mojo::JSON和存储的客户端,使用加密签名来防止篡改。

使用Mojolicious::Lite签名;#访问操作和模板中的会话数据获取“/counter”=>sub($c){$c->session->{counter}++;};应用程序->启动;__数据__@@计数器.html.ep计数器:<%=会话“计数器”%>

请注意,您应该使用自定义Mojolicious中的“秘密”使签名的cookie真正防篡改。

app->secrets(['My secret passphrase here']);

文件上传

通过上载的所有文件多部分/表单数据请求自动可用为Mojo::上传来自的对象Mojolicious::Controller中的“param”。您不必担心内存使用,因为所有高于250KiB的文件都会自动流式传输到一个临时文件中。为了更有效地构建HTML表单,您还可以使用标记帮助器,如Mojolicious::Plugin::TagHelpers中的“form_for”.

使用Mojolicious::Lite签名;#在DATA部分上传表单获取'/'=>'form';#多部分上传处理程序发布“/upload”=>sub($c){#检查文件大小如果$c->req->is_limit_exceeded,则返回$c->render(text=>“文件太大。”,状态=>200);#处理上传的文件返回$c->redirect_to('form'),除非我的$example=$c->param('example');my$size=$example->size;my$name=$example->文件名;$c->render(text=>“感谢上传$size字节文件$name。”);};应用程序->启动;__数据__@@表单html.ep<!DOCTYPE html><html>上传<body>%=form_for上传=>(enctype=>“多部分/表单数据”)=>开始%=file_field“示例”%=submit_button“上传”%结束</body></html>

为了保护您免受过大文件的影响,默认情况下还有一个16MiB的限制,您可以使用属性进行调整Mojolicious中的“max_request_size”.

#将限制增加到1GiB应用程序->最大请求大小(1073741824);

用户代理

使用Mojo::用户代理,可通过助手使用Mojolicious::Plugin::DefaultHelpers中的“ua”,内置了功能齐全的HTTP和WebSocket用户代理。特别是与Mojo::JSONMojo::DOM这可能是一个非常强大的工具。

使用Mojolicious::Lite签名;#阻塞get'/headers'=>子($c){my$url=$c->param('url')||'https://mojolicious.org';my$dom=$c->ua->get($url)->result->dom;$c->render(json=>$dom->find('h1,h2,h3')->映射('text')->to_array);};#非阻塞获取'/title'=>sub($c){$c->ua->get('mojolicious.org'=>sub($ua,$tx){$c->render(数据=>$tx->result->dom->at('title')->文本);});};#并发非阻塞获取“/titles”=>sub($c){我的$mojo=$c->ua->getp('https://mojolicious.org');我的$cpan=$c->ua->getp('https://metapan.org');Mojo::Promise->all($Mojo,$cpan)->then(sub($Mojo,$cpan){$c->render(json=>){mojo=>$mojo->[0]->结果->dom->at('title')->文本,cpan=>$cpan->[0]->result->dom->at(“标题”)->文本});})->等待;};应用程序->启动;

有关用户代理的更多信息,请参见Mojolicious::Guides::Cookbook中的“用户代理”.

WebSockets(网络套接字)

WebSocket应用程序以前从未如此简单。只需通过订阅以下事件来接收消息Mojo::Transaction::WebSocket中的“json”具有Mojolicious::Controller中的“on”并将其与Mojolicious::Controller中的“send”.

使用Mojolicious::Lite签名;网络套接字“/echo”=>sub($c){$c->on(json=>sub($c,$hash){$hash->{msg}=“echo:$hash->{msg{”;$c->send({json=>$hash});});};获取“/”=>“索引”;应用程序->启动;__数据__@@索引.html.ep<!DOCTYPE html><html><头部><title>回声</title><脚本>const ws=新WebSocket('<%=url_for('echo')->to_abs%>');ws.onmessage=函数(事件){document.body.innerHTML+=JSON.parse(event.data).msg;};ws.onopen=函数(事件){ws.send(JSON.stringify({msg:'IMojolicious!“});};</script></头></html>

有关实时web功能的更多信息,请参阅Mojolicious::Guides::Cookbook中的“实时网络”.

模式

您可以使用Mojo::日志对象来自Mojolicious中的“log”通过更改莫乔利奇操作模式,也可以从属性中检索Mojolicious中的“模式”.

使用Mojolicious::Lite签名;#启动期间准备特定于模式的消息my$msg=app->mode eq“开发”?”开发!':'还有别的!”;获取“/”=>子($c){$c->app->log->debug(“呈现模式特定消息”);$c->render(文本=>$msg);};app->log->debug(“启动应用程序”);应用程序->启动;

默认操作模式通常为发展可以使用命令行选项或MOJO_模式播放_ENV环境变量。除以下模式之外的模式发展将从以下位置提升日志级别追踪信息。所有消息都将写入STDERR公司默认情况下。

$ ./myapp.pl守护进程-m生产

模式更改也会影响框架的其他几个方面,例如内置例外找不到(_F)页。一旦您从发展生产,这些页面上不再显示任何敏感信息。

测试

测试应用程序就像创建t吨目录并用普通的Perl测试填充它,如t/基本。t吨,多亏了测试::Mojo.

使用测试::更多;使用Mojo::File qw(curfile);使用测试::Mojo;#可移植地指向“../myapp.pl”my$script=curfile->dirname->sibling('myapp.pl');my$t=测试::Mojo->new($script);$t->get_ok('/')->status_is(200)->content_like(qr/Funky/);done_testing();

只需使用运行测试证明.

$证明-l-v$prove-l-v t/basic。t吨

更多

您可以继续Mojolicuis::指南现在或者看看Mojolicious维基,其中包含许多不同作者编写的更多文档和示例。

支持

如果您有任何文档可能尚未回答的问题,请毫不犹豫地在论坛,上的IRC公司,或矩阵.