0

我在一个控制器中有一个动作,需要隐藏一些数据库记录来呈现表格。

我在第二个控制器中有一个动作,它填充了一个非常相似的表,因此它自己的存储中的数据与我需要的第一个相同。

如果不在两个控制器中复制一堆代码,有没有办法使用一个动作来填充另一个动作的存储?

编辑: 响应代码请求(有些简化,但应该了解要点):

在 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,
);
}

在控制器::供应商

sub viewform : Chained('row') Args(1) {
    my ( $self, $c, $view ) = @_;

    $c->stash(
        template => 'simpleItem.mas',
        view => $view,
    );
}

simpleItem.mas 模板需要数据、dataRowCount、totalCount、pageSize,因此从 Controller::ShoppingCart::pageData 中获取存储是理想的。

4

2 回答 2

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,
    );
}

所有血腥细节,包括、forward()like和的兄弟姐妹。detach()go()visit()

于 2013-01-31T02:53:31.293 回答
0

您可以将这两个操作链接到另一个函数,例如 in Root.pm,这将获取这些数据库记录并将它们放入存储中。

IE:

# 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}
}
于 2013-01-30T05:55:06.247 回答