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 マニュアルから: 新しい引数を無名配列に追加することで、転送アクションに渡すことができます。呼び出されたメソッド (または転送されたメソッド) では、 で引数を取得します$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...
}

$c->stash->{typeid};代わりにstash を使用することもできます。その後、 を使用してメソッドを直接呼び出すことができます$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 に答える