背景:
我在 Catalyst 中使用了一个 CRUD 框架,它为给定数据库中的所有表自动生成表单和列表。例如:
/admin/list/person 或/admin/add/person 或/admin/edit/person/3 都根据表 'person' 动态生成页面或表单。 (换句话说,Admin.pm 具有编辑、列出、添加、删除等操作,这些操作需要表参数,也可能是行标识参数。)
问题:
在我正在构建的特定应用程序中,数据库将被多个客户使用,因此我想引入一个 URI 方案,其中第一个元素是客户的标识符,然后是管理操作/表等:
这是出于“品牌化”的目的,也是为了确保从一个用户传递给另一个用户的书签或 URL 达到预期的效果。
但是我在让它工作时遇到了很多麻烦。我不想修改现有框架中的 subs,所以我一直在尝试以下变化:
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 的第一个“桶”中似乎异常痛苦。任何建议都非常感谢。
最佳答案
使客户操作 :Chained 然后将管理操作链接到该操作。例如:
sub customer :Chained('/') :PathPart('') :CaptureArgs(1) {
# load current customer into the stash
}
sub admin :Chained('customer') :PathPart('admin') :Args(0) {
}
有关更多信息,请参阅 Catalyst::DispatchType::Chained
关于perl - 如何引入正则表达式操作以匹配 Catalyst URI 中的第一个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6475487/