如何解决如何引入正则表达式操作以匹配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和相关思想动态生成所有潜艇,但最终不得不承认失败了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。