从另一个控制器的动作填充藏匿处

时间:2013-01-30 05:36:08

标签: perl catalyst

我在一个控制器中有一个操作,需要一些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中获取存储将是理想的。

2 个答案:

答案 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}
}