3

Catalyst中,我试图转发到一个私人行动来做一些工作。这是函数定义:

sub get_form :Private :Args(1) {
  my ($self, $c, $type_id) = @_;
  #do stuff
}

我尝试像这样转发它:

$c->forward('get_form',[$type_id]);

但它只是给了我这个错误:

Couldn't forward to command "get_form": Invalid action or component.

但是,如果我将操作从 更改:Private:Local,那么它可以工作。有谁知道这是为什么以及如何解决它?谢谢!

4

3 回答 3

7

您不需要而不能:Args(1)用于 Catalyst 中的私人操作。

来自 cpan Catalyst Manual:您可以通过将新参数添加到匿名数组中来将新参数传递给转发操作。在被调用的方法(或转发的方法)中,您将在$c->req->args.

sub hello : Global {
    my ( $self, $c ) = @_;
    $c->stash->{message} = 'Hello World!';
    $c->forward('check_message',[qw/test1/]);
}

sub check_message : Private {
    my ( $self, $c, $first_argument ) = @_;
    my $also_first_argument = $c->req->args->[0]; # now = 'test1'
    # do something...
}

您也可以使用 stash$c->stash->{typeid};代替。然后你可以直接使用$c->forward('priv_method');.

前任:

   sub hello : Global {
        my ( $self, $c ) = @_;
        $c->stash->{message} = 'Hello World!';
        $c->forward('check_message'); # $c is automatically included
    }

    sub check_message : Private {
        my ( $self, $c ) = @_;
        return unless $c->stash->{message};
        $c->forward('show_message');
    }

    sub show_message : Private {
        my ( $self, $c ) = @_;
        $c->res->body( $c->stash->{message} );
    }
于 2013-02-14T07:19:42.327 回答
4

如果我猜,那是因为您告诉要匹配某些 url ( :Args(1)),但:Private“永远不会匹配 URL”。“催化剂的:Private属性是专有的,不能与其他属性一起使用”。尝试通过上下文对象传递信息。

于 2013-02-14T05:47:45.070 回答
4

如果您愿意,您也可以完全避免 forward() ,如果它是同一个控制器,则只需调用该方法:

sub myaction : Global {
    my ( $self, $c ) = @_;
    $self->dosomething( $c, 'mystring' );
}

sub dosomething {
    my ( $self, $c, $argument ) = @_;
    $c->log->info( $argument );
}

即使您必须$c四处走动,这通常也是一种更易于阅读的方法。

于 2013-02-14T17:08:16.357 回答