【问题标题】:catalyst can't forward to private action催化剂不能转发到私人行动
【发布时间】:2013-02-15 01:08:16
【问题描述】:

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,那么它会起作用。有谁知道这是为什么以及如何解决它?谢谢!

【问题讨论】:

    标签: perl action private catalyst forward


    【解决方案1】:

    在 Catalyst 中,您不需要也不能使用 :Args(1) 进行私人操作。

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

    【讨论】:

    • 很好的解释!谢谢:)
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-08
        • 2020-01-05
        • 2020-12-14
        • 2013-04-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多