Mojolicious路由(二)

一、可逆性

与正则表达式相比,路由还有一个更大的优势,那就是它们很容易可逆,提取的占位符可以在任何时候被转换回路径。

/sebastian -> /:name -> {name => 'sebastian'}
{name => 'sebastian'} -> /:name -> /sebastian

每个占位符都有一个名称,即使它只是一个空字符串。

二、标准的占位符

标准占位符是最简单的占位符形式,它们使用冒号前缀并匹配除”/”和”.”之外的所有字符,类似于([^/.]+)。

/hello              -> /:name/hello -> undef
/sebastian/23/hello -> /:name/hello -> undef
/sebastian.23/hello -> /:name/hello -> undef
/sebastian/hello    -> /:name/hello -> {name => 'sebastian'}
/sebastian23/hello  -> /:name/hello -> {name => 'sebastian23'}
/sebastian 23/hello -> /:name/hello -> {name => 'sebastian 23'}

所有占位符都可以用<和>包围起来,以将它们与周围的文本分开。

/hello             -> /<:name>hello -> undef
/sebastian/23hello -> /<:name>hello -> undef
/sebastian.23hello -> /<:name>hello -> undef
/sebastianhello    -> /<:name>hello -> {name => 'sebastian'}
/sebastian23hello  -> /<:name>hello -> {name => 'sebastian23'}
/sebastian 23hello -> /<:name>hello -> {name => 'sebastian 23'}

冒号前缀对于被<和>包围的标准占位符是可选的

/i♥mojolicious -> /<one>♥<two> -> {one => 'i', two => 'mojolicious'}

二、松散的占位符

轻松占位符与标准占位符类似,但使用散列前缀并匹配除/之外的所有字符,类似于正则表达式([^/]+)。

/hello              -> /#name/hello -> undef
/sebastian/23/hello -> /#name/hello -> undef
/sebastian.23/hello -> /#name/hello -> {name => 'sebastian.23'}
/sebastian/hello    -> /#name/hello -> {name => 'sebastian'}
/sebastian23/hello  -> /#name/hello -> {name => 'sebastian23'}
/sebastian 23/hello -> /#name/hello -> {name => 'sebastian 23'}

它们对于手动匹配带有扩展名的文件名特别有用,从而代替格式检测。

/music/song.mp3 -> /music/#filename -> {filename => 'song.mp3'}

标签