Mojolicious路由(四)

一、路由目的地

在使用Mojolicious::Routes:: route中的“get”等方法启动一条新路由后,还可以使用Mojolicious::Routes:: route中的链接方法“to”以哈希的形式给它指定一个目的地。

# /welcome -> {controller => 'foo', action => 'welcome'}
$r->get('/welcome')->to(controller => 'foo', action => 'welcome');

现在,如果路由与传入的请求匹配,它将使用该散列的内容来尝试寻找适当的代码来生成响应。

二、HTTP方法

对于最常见的HTTP请求方法,已经有了一些快捷方式,比如Mojolicious::Routes::Route中的“post”。为了实现更多的控制,Mojolicious::Routes::Route中的“any”接受一个可选的数组引用,并将任意请求方法作为第一个参数。

# PUT /hello  -> undef
# GET /hello  -> {controller => 'foo', action => 'hello'}
$r->get('/hello')->to(controller => 'foo', action => 'hello');

# PUT /hello -> {controller => 'foo', action => 'hello'}
$r->put('/hello')->to(controller => 'foo', action => 'hello');

# POST /hello -> {controller => 'foo', action => 'hello'}
$r->post('/hello')->to(controller => 'foo', action => 'hello');

# GET|POST /bye  -> {controller => 'foo', action => 'bye'}
$r->any(['GET', 'POST'] => '/bye')->to(controller => 'foo', action => 'bye');

# * /whatever -> {controller => 'foo', action => 'whatever'}
$r->any('/whatever')->to(controller => 'foo', action => 'whatever');

有一个小的例外,HEAD请求被认为与GET相等,但是即使响应存在,内容也不会与响应一起发送。

# GET /test  -> {controller => 'bar', action => 'test'}
# HEAD /test -> {controller => 'bar', action => 'test'}
$r->get('/test')->to(controller => 'bar', action => 'test');

还可以使用_method查询参数来覆盖请求方法。这在使用只支持GET和POST的浏览器提交表单时非常有用。

# PUT  /stuff             -> {controller => 'baz', action => 'stuff'}
# POST /stuff?_method=PUT -> {controller => 'baz', action => 'stuff'}
$r->put('/stuff')->to(controller => 'baz', action => 'stuff');

标签