/ / catalyst não pode encaminhar para ação privada - perl, ação, privado, catalisador, encaminhar

catalisador não pode encaminhar a ação privada - perl, ação, privado, catalisador, frente

Dentro Catalisador Estou tentando encaminhar para uma ação privada para fazer algum trabalho. Aqui está a definição da função:

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

Tento encaminhá-lo assim:

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

Mas me dá este erro:

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

No entanto, se eu mudar a ação de :Private para :Local, então funciona. Alguém sabe por que isso acontece e como consertar? Obrigado!

Respostas:

7 para resposta № 1

Você não precisa, em vez disso, não pode usar :Args(1) para ações privadas no Catalyst.

Do manual do catalisador cpan: Você pode passar novos argumentos para uma ação de encaminhamento adicionando-os em uma matriz anônima. No método chamado (ou método encaminhado), você obteria argumentos em $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...
}

Você também pode usar stash $c->stash->{typeid}; em vez de. Então você pode chamar diretamente o método usando $c->forward("priv_method");.

Ex:

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

3 para resposta № 2

Se eu fosse adivinhar, é porque você está dizendo para corresponder a certos urls (:Args(1)), mas :Private "nunca corresponderá a um URL". "Catalisador" s :Private atributo é exclusivo e "não funciona com outros atributos". Em vez disso, tente passar informações por meio do objeto de contexto.


3 para resposta № 3

Você também pode evitar forward () se desejar e apenas chamar o método se for o mesmo controlador:

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

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

Mesmo que você tenha que passar $c ao redor, muitas vezes pode ser uma abordagem mais fácil de ler.