Mojolicious路由(八)

一、可选占位符

提取的占位符值将简单地重新定义旧的stash值(如果它们已经存在)。

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

还有一个更有趣的效果,如果已经存在同名的stash值,占位符会自动变成可选的,这类似于正则表达式([^/.]+)?

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

# /test/123     -> {controller => 'foo', action => 'bar', mymessage => 'hi'}
# /test/bye/123 -> {controller => 'foo', action => 'bar', mymessage => 'bye'}
$r->get('/test/:mymessage/123')->to('foo#bar', mymessage => 'hi');

如果两个可选的占位符仅由斜杠分隔,斜杠也可以成为可选的。

# /           -> {controller => 'foo',   action => 'bar'}
# /users      -> {controller => 'users', action => 'bar'}
# /users/list -> {controller => 'users', action => 'list'}
$r->get('/:controller/:action')->to('foo#bar');

像controller和action这样的特殊隐藏值也可以作为占位符,这在开发过程中非常方便,但必须非常小心地使用,因为每个controller方法都可能成为潜在的路径。所有大写方法以及以下划线开头的方法都会自动在路由器上隐藏,我们可以在Mojolicious::Routes中使用“hide”来添加额外的方法。

# Hide "create" method in all controllers
$r->hide('create');

Mojolicious::Controller的所有属性和方法都已经这样做了。

标签