Mojolicious路由(五)

一、IRIs

IRIs是透明处理的,这意味着路径保证不被转义,并从字节解码为字符。

# GET /☃ (Unicode snowman) -> {controller => 'foo', action => 'snowman'}
$r->get('/☃')->to(controller => 'foo', action => 'snowman');

二、stash

匹配路由生成的散列实际上是整个Mojolicious请求周期的中心。我们将其称为stash,并将一直持续到生成响应为止。

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

有一些具有特殊意义的隐藏值,比如controller和action,但通常可以用生成响应所需的任何数据填充它。一旦分派,整个stash内容可以在任何时候更改。

sub bye ($self) {
 
  # 从stash中获取mymessage信息
  my $msg = $self->stash('mymessage');
 
  # 改变stash中的mymessage的值
  $self->stash(mymessage => 'Welcome');
}

有关保留的stash值的完整列表,请参阅Mojolicious::Controller中的“stash”。

三、嵌套路由

也可以从路由中构建树结构来删除重复代码。但是,带有子路由的路由不能自己匹配,只有这些嵌套路由的实际端点才能匹配。

# /foo     -> undef
# /foo/bar -> {controller => 'foo', action => 'bar'}
my $foo = $r->any('/foo')->to(controller => 'foo');
$foo->get('/bar')->to(action => 'bar');

这个stash只是从一个路由继承到另一个路由,新的值覆盖旧的值。

# /cats      -> {controller => 'cats', action => 'index'}
# /cats/nyan -> {controller => 'cats', action => 'nyan'}
# /cats/lol  -> {controller => 'cats', action => 'default'}
my $cats = $r->any('/cats')->to(controller => 'cats', action => 'default');
$cats->get('/')->to(action => 'index');
$cats->get('/nyan')->to(action => 'nyan');
$cats->get('/lol');

使用少量的通用前缀,我们还可以极大地提高具有许多路由的应用程序的路由性能,因为只有在前缀先匹配时才会尝试子路由。

标签