扶凯

取势 明道 优术

作者为 扶 凯 发表

本文用于介绍一下 Mojolicious 中的常用, 但可能文档没提到的东西, 或者一些因为版本兼容性而发生变化的(Mojolicous 版本更新比较快),但这个变化也是很常用的东西. 本书中所有的内容都是一条条小技巧, 有的可能是常识, 常用, 都不能叫做小技巧. 这些大多是我自己常用的一些东西. 在这给大家分享一下.
本文都假设各位都对 Mojolicious 这个现代化的框架非常了解, 所以并不介绍框架的一些常识.
另外各位如果有好的技巧和意见也可以在这个文章下面告诉我.

Mojolicious 中最常用的变量的意义:
正常的类都是通过 $self 来引用类, 得到各种类, 在 Mojolicious 中, 可能不太一样, 在新的 Mojolicious 6.0 以后很少使用 $self 来表示这些了.

$app    # 你的 Mojolicious 的应用, 在 Mojolicious::Lite 中 这个直接是 app 这个
$r      # 你的路径选择, 是 Mojolicious::Routes 这个类, 在应用中通过 $app->routes 得到和调整
$c      #  你的应用中的逻辑控制的类, 是由 Mojolicious::Controller 这个创建.
$ua     # Mojo::UserAgent

Mojolicious 中括号在路径选择器中的特殊意思
在 Mojolicious 中有各种非常方便的使用方式, 通过在路由中间换不同的括号, 可以代表不同的意思.

get '/foo' => (agent => qr/Firefox/)                    # 条件
get '/hello/:name' => {name => 'Sebastian'} #  默认值
get '/:bar' => [bar => qr/\d+/] => sub                 # 过滤匹配


怎么在 Mojolicious 的程序中控制开启的端口和监听的 IP ?
其实文档当中有这个, 但很多人还是问到. 因为他们想在程序中直接给这个写死.

app->config(hypnotoad => {listen => ['http://*:80']});

自定义模板路径, 使用自己的路径做为默认的模板或者静态文件?

push @{app->renderer->paths}, '/path/to/your/templates'; # 模板
push @{app->static->paths}, '/home/xxx/public'; # 静态文件

取远程客户端的 ip
这个功能对我很常用, 要记住, 在每一个连接当中, 都能取到连接相关的信息, 这个连接在 Mojolicious 中就是 tx 来表示的.

$c->tx->remote_address

给取到的文件, 直接在 Mojo::UserAgent 中直接存成本地文件

$ua->get($url)->res->content->asset->move_to($file);



生成可以移植的地址
这个地方其实很有讲究, 重点是, 如果传进去的是引用, 会和原来的参数合并, 并且引中中如果使用数组, 就可以产生同名的参数

# 使用 merge 的话, 会给原来的参数合并到一起. 生成: "a=2&b=2&c=3"
Mojo::URL->new('http://example.com?a=1&b=2')->query->merge(a => 2, c => 3);

# 不然, 会给默认的参数都替换掉, 使用 query 生成的, 例如: "http://example.com?a=2&c=3"
Mojo::URL->new('http://example.com?a=1&b=2')->query(a => 2, c => 3);

# 没合并, 生成新参数, 如果使用数组的话, 会可以让参数重复 "http://example.com?a=2&a=3"
Mojo::URL->new('http://example.com?a=1&b=2')->query(a => [2, 3]);

# 如果整个参数都是数组, 这时生成的就会和原来的合并, 并且可以有重复的参数,
# 例如: "http://example.com?a=2&b=2&c=3"
Mojo::URL->new('http://example.com?a=1&b=2')->query([a => 2, c => 3]);

# 想删除一个参数, 只需要能相应的 key 设置成 undef 就可以了.例如: "http://example.com?b=2"
Mojo::URL->new('http://example.com?a=1&b=2')->query([a => undef]);

# 默认传送一个数组, 会直接合并. "http://example.com?a=1&b=2&a=2&c=3"
Mojo::URL->new('http://example.com?a=1&b=2')->query({a => 2, c => 3});

来了就留个评论吧! 没有评论