我在一个控制器中有一个操作,需要一些db记录存储来呈现一个表。
我在第二个控制器中有一个操作,它填充了一个非常相似的表,因此它自己的存储中的数据与第一个控制中的数据相同。
如果没有在两个控制器中复制一堆代码,有没有办法使用一个动作来填充另一个的存储?
修改 响应代码请求(稍微简化,但应该得到要点):
在Contoller :: ShoppingCart
中sub data : Chained('base') PathPart('') CaptureArgs(0) {
my ( $self, $c ) = @_;
my $query = DBRESULTS;
my $count = 20;
$c->stash(
data => $items,
dataRowCount => scalar @$items,
totalCount => $count,
pageSize => $pageSize,
);
}
在Controller :: Vendor
中sub viewform : Chained('row') Args(1) {
my ( $self, $c, $view ) = @_;
$c->stash(
template => 'simpleItem.mas',
view => $view,
);
}
simpleItem.mas模板需要data,dataRowCount,totalCount,pageSize,因此从Controller :: ShoppingCart :: pageData中获取存储将是理想的。
答案 0 :(得分:1)
您应该只需$c->forward()
即可完成所需的具体操作。
sub viewform : Chained('row') Args(1) {
my ( $self, $c, $view ) = @_;
$c->forward('Controller::ShoppingCart', 'data', [ @optional_args ]);
$c->stash(
template => 'simpleItem.mas',
view => $view,
);
}
All the gory details,包括forward()
的兄弟姐妹,例如detach()
,go()
和visit()
。
答案 1 :(得分:0)
您可以将这两个操作链接到另一个函数,例如在Root.pm
中,它将获取这些数据库记录并将它们存放在存储区中。
即:
# in Root.pm
sub get_db_stuff :Path('') :Args(0) {
my ( $self, $c ) = @_;
#store stuff in stash
$c->stash->{db} = #get db records
}
然后你在其他控制器中你需要这两个功能:
sub base : Chained('/get_db_stuff') PathPrefix CaptureArgs(0) {}
sub use_db_stuff : Chained('base') PathPart Args(0) {
my ( $self, $c ) = @_;
#db records now accessible through $c->stash->{db}
}