【问题标题】:match namespace case insensitive in Catalyst controller在 Catalyst 控制器中匹配命名空间不区分大小写
【发布时间】:2012-03-26 21:36:01
【问题描述】:
__PACKAGE__->config(namespace => 'Hello')

现在考虑我的催化剂控制器Hello.pm中有上述语句。
这将匹配 url 中的 http://localhost:3000/Hello
但我也想匹配http://localhost:3000/hello

我尝试如下实现此目的的一种方法

sub match_hello : Path('/hello')
{
my ( $self, $c ) = @_;
$c->response->body("lowercase hello also matched"); 

}

但是,我们也可以使用__PACKAGE__->config(namespace => ... ) 语句来实现相同的功能吗?

【问题讨论】:

    标签: perl catalyst


    【解决方案1】:

    无需弄乱命名空间。阅读Action types in Catalyst::Manual::Intro

    LocalRegex 操作添加到根控制器。

    sub match_hello :LocalRegex('(?i)^hello$') {
        my ($self, $c) = @_;
        $c->response->body('case-insensitive hello matches');
    }
    

    调试输出:

    [debug] Loaded Regex actions:
    .-------------------------------------+--------------------------------------.
    | Regex                               | Private                              |
    +-------------------------------------+--------------------------------------+
    | ^(?:.*?)(?i)^hello$                 | /match_hello                         |
    '-------------------------------------+--------------------------------------'
    

    请求:

    $ GET http://localhost:5000/HeLlO
    case-insensitive hello matches
    

    【讨论】:

    • 当存在__PACKAGE__->config(namespace => 'Hello'); 语句时,您的解决方案不会运行。但是,如果命名空间为空,即__PACKAGE__->config(namespace => '');我想要使用Hello 命名空间的解决方案,并且此Hello 应该不区分大小写.
    • @daxim- 您的解决方案中需要进行的一项更改是Regex 操作而不是LocalRegex。然后它将起作用。但是它仍然只会匹配一个方法而不是控制器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-14
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    相关资源
    最近更新 更多