Perl Dancer尾随斜线

时间:2013-02-18 10:28:36

标签: perl dancer

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

比如说,我希望将以下网址与可选的Id参数匹配:

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

/users/morgan/users/都匹配。虽然/users不会。哪个看起来不太均匀。因为我更喜欢,只匹配URL:s而没有尾部斜杠: /users/morgan/users。我将如何实现这一目标?

3 个答案:

答案 0 :(得分:8)

另一种方法是使用一个命名子 - 所有Dancer代码的例子都倾向于使用匿名子,但没有任何东西说它必须是匿名的。

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

sub show_users
{
    #Do something
}

请注意,由于Dancer进行路线匹配的方式,这是依赖于顺序的,根据我的经验,我必须首先列出具有较少元素的路线。

答案 1 :(得分: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'
  }
};

答案 2 :(得分:2)

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

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

此外,正如Dave Sherohman提到的那样,您绝对应该先安排较少元素的路线,以便与之首先匹配,尤其是如果您使用TrailingSlash中间件强制尾随斜杠。