【问题标题】:Perl Dancer trailing slashPerl Dancer 斜杠
【发布时间】:2013-02-18 10:28:36
【问题描述】:

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

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

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

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

【问题讨论】:

  • /users/ 匹配的原因是因为? 这意味着:id 是可选的。我会尝试/users(/:id)?

标签: perl dancer


【解决方案1】:

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

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

sub show_users
{
    #Do something
}

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

【讨论】:

    【解决方案2】:

    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'
      }
    };
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-12-22
        • 1970-01-01
        • 2010-10-29
        • 1970-01-01
        • 2014-06-19
        • 2014-03-21
        • 1970-01-01
        • 1970-01-01
        • 2010-11-01
        相关资源
        最近更新 更多