Mojolicious路由(九)
一、限制性的占位符
一种使占位符更具限制性的非常简单的方法,我们只需列出可能的值列表,然后它的工作方式类似于正则表达式(bender|leela)。
# /fry -> undef
# /bender -> {controller => 'foo', action => 'bar', name => 'bender'}
# /leela -> {controller => 'foo', action => 'bar', name => 'leela'}
$r->get('/:name' => [name => ['bender', 'leela']])->to('foo#bar');
我们也可以直接调整占位符后面的正则表达式,只是要确保不要使用^和$或捕获组(…),因为占位符会成为更大的正则表达式的一部分,但是非捕获组(?:…)就可以使用。
# /23 -> {controller => 'foo', action => 'bar', number => 23}
# /test -> undef
$r->get('/:number' => [number => qr/\d+/])->to('foo#bar');
# /23 -> undef
# /test -> {controller => 'foo', action => 'bar', name => 'test'}
$r->get('/:name' => [name => qr/[a-zA-Z]+/])->to('foo#bar');
通过这种方式,我们可以获得易于阅读的路由和正则表达式的强大功能。
二、占位符类型
如果我们有多个使用限制性占位符的路由,也可以在Mojolicious:: routes中使用“add_type”将它们转换为占位符类型。
# A type with alternatives
$r->add_type(futurama_name => ['bender', 'leela']);
# /fry -> undef
# /bender -> {controller => 'foo', action => 'bar', name => 'bender'}
# /leela -> {controller => 'foo', action => 'bar', name => 'leela'}
$r->get('/<name:futurama_name>')->to('foo#bar');
占位符类型就像限制性占位符一样工作,它们只是可以通过< Placeholder:type>表示法重用。
# A type adjusting the regular expression
$r->add_type(upper => qr/[A-Z]+/);
# /user/ROOT -> {controller => 'users', action => 'show', name => 'ROOT'}
# /user/root -> undef
# /user/23 -> undef
$r->get('/user/<name:upper>')->to('users#show');
有些类型(如num)的使用非常普遍,因此它们在默认情况下是可用的。
# /article/12 -> {controller => 'article', action => 'show', id => 12}
# /article/test -> undef
$r->get('/article/<id:num>')->to('articles#show');
有关可用占位符类型的完整列表,请参见Mojolicious::Routes中的“types”。