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