如何引入正则表达式操作以匹配Catalyst URI中的第一个元素?

问题描述

| 背景: 我在Catalyst中使用CRUD框架,该框架可自动生成给定数据库中所有表的表单和列表。例如: / admin / list / person或/ admin / add / person或/ admin / edit / person / 3都根据表'person \'动态生成页面或表单。 (换句话说,Admin.pm具有可编辑,列出,添加,删除等操作,这些操作期望使用表参数,并可能需要行标识参数。) 题: 在我正在构建的特定应用程序中,数据库将由多个客户使用,因此我想引入一个URI方案,其中第一个元素是客户的标识符,然后是管理操作/表等: / cust1 / admin / list / person / cust2 / admin / add / person / cust2 / admin / edit / person / 3 这是出于“品牌化”的目的,并且还可以确保从一个用户传递给另一个用户的书签或URL可以完成预期的操作。 但是,要使它正常工作我很麻烦。我希望不必在现有框架中修改子项,因此我一直在尝试以下方面的变体:
sub customer : Regex(\'^(\\w+)/(admin)$\') {
    my ($self,$c,@args) = @_;
    #validation of captured arg snipped..
    my $path = join(\'/\',\'admin\',@args);
    $c->request->path($path);
    $c->dispatcher->prepare_action($c);
    $c->forward($c->action,$c->req->args);
}
但是它只是不会表现。我已经多次使用过正则表达式匹配操作,但是将其放在URI的第一个“桶”中似乎很不正常。任何建议表示感谢。     

解决方法

        使客户操作:被束缚,然后将管理操作链接到该操作。例如:
sub customer :Chained(\'/\') :PathPart(\'\') :CaptureArgs(1) {
    # load current customer into the stash
}

sub admin :Chained(\'customer\') :PathPart(\'admin\') :Args(0) {
}
有关更多信息,请参见Catalyst :: DispatchType :: Chained     ,        我将Dimitar的答案标记为正确的答案,因为它使我走上了解决这一问题的正确道路。 (到目前为止,我从未真正需要-或过时的FTM-连锁动作。) 这是我对各种控制器所拥有的,适合任何感兴趣的人。
=== Root.pm ===

sub customer_home : Path: Args(1) { # eg /cust1
    my ($self,$c,$custarg) = @_;
    ...
}

sub ourclub :Chained(\'/\') :PathPart(\'\') :CaptureArgs(1) { # eg /cust1/<admin-function>
    my ($self,$custarg) = @_;
    ...
}

=== Admin.pm ===

use base \'Framework::Controller\';

# create chained action versions of the framework actions
sub admin       :Chained(\'/customer\') :PathPart(\'admin\')     { shift->SUPER::admin(@_) }
sub list        :Chained(\'/customer\') :PathPart(\'list\')      { shift->SUPER::list(@_) }
sub view        :Chained(\'/customer\') :PathPart(\'view\')      { shift->SUPER::view(@_) }
sub add         :Chained(\'/customer\') :PathPart(\'add\')       { shift->SUPER::add(@_) }
sub edit        :Chained(\'/customer\') :PathPart(\'edit\')      { shift->SUPER::edit(@_) }
sub delete      :Chained(\'/customer\') :PathPart(\'delete\')    { shift->SUPER::delete(@_) }
sub search      :Chained(\'/customer\') :PathPart(\'search\')    { shift->SUPER::search(@_) }
sub model       :Chained(\'/customer\') :PathPart(\'model\')     { shift->SUPER::model(@_) }
我热衷于通过ѭ3和相关思想动态生成所有潜艇,但最终不得不承认失败了。     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...