5

使用 Perl Web 应用程序框架 Dancer,我在 URL 匹配中遇到了尾随斜杠的一些问题。

例如,我想使用可选的 Id 参数匹配以下 URL:

get '/users/:id?' => sub
{
    #Do something
}

两者/users/morgan兼得/users/。虽然/users不会。这似乎不是很统一。因为我更喜欢,只匹配不带斜杠的 URL:s: /users/morgan/users. 我将如何实现这一目标?

4

3 回答 3

8

另一种方法是使用命名子 - 所有 Dancer 代码示例都倾向于使用匿名子,但没有任何内容表明它必须是匿名的。

get '/users' => \&show_users;
get '/users/:id' => \&show_users;

sub show_users
{
    #Do something
}

请注意,由于 Dancer 进行路线匹配的方式,这取决于顺序,并且根据我的经验,我必须首先列出元素较少的路线。

于 2013-02-18T13:43:18.093 回答
5

id将包含从/user/开始到可选斜杠的所有内容。

get qr{^/users/?(?<id>[^/]+)?$} => sub {
  my $captures = captures;
  if ( defined $captures->{id} ) {
    return sprintf 'the id is: %s', $captures->{id};
  }
  else {
    return 'global user page'
  }
};
于 2013-02-18T11:07:50.347 回答
2

我知道这是一个老问题,但我最近通过使用 Plack 中间件解决了这个问题。您可以选择其中两个,具体取决于您是否喜欢带有斜杠的 URL:

使用上述任何中间件都应该大大简化您的核心 Dancer 应用程序代码和单元测试,因为您不需要处理这两种情况。

此外,正如 Dave Sherohman 所提到的,您绝对应该首先使用较少的元素来安排您的路线,以便首先匹配那些元素,特别是如果您使用 TrailingSlash 中间件来强制尾部斜杠。

于 2018-11-08T06:28:37.083 回答