Como faço para chamar um 'action' em outro 'controller'?

3,741 views
Skip to first unread message

Vegetus

unread,
Apr 27, 2012, 2:40:52 PM4/27/12
to Zend Framework Brasil
Pessoal,

Tenho uma classe 'controller' com vários 'actions'. E um destes
'actions' faz manipulação de informações, onde salva estas informações
nas variáveis e, em seguida, renderiza automaticamente numa view (isto
é, o nome da view é de acordo com o nome do action).

Porém, eu gostaria de COMPLEMENTAR mais informações nesta action,
chamando uma 'action' em outro 'controller'.

OBS: os métodos $this->_foward() e $this->_redirect() não fazem
exatamente do que eu gostaria, pois é um método void.

Alguém sabe?

Obrigado.

Filipe Mota

unread,
Apr 27, 2012, 2:46:04 PM4/27/12
to zfbr...@googlegroups.com
E ae!
Se voce quer complementar o codigo, digo, adicionar uma funcionalidade a mais que voce vai utilizar em outras actions, eu faria um action helper para o auxilio.

Agora se seu caso é direcionar para outra ação mesmo, tipo passos de um cadastro, seria com redirect mesmo cara,
exemplo:

$this->_redirect('controller/action'); 

(em açoes do mesmo controller voce usa o forward)

$this->_foward(action)


--
     

Vegetus

unread,
Apr 27, 2012, 3:00:45 PM4/27/12
to Zend Framework Brasil
Fala Filipe.

Não quero criar uma action helper. Ao que eu li os artigos na web, é
um recurso totalmente desnecessário e até foi proposto para removê-lo
no ZF2. Os artigos são: http://www.rmauger.co.uk/2009/03/why-the-zend-framework-actionstack-is-evil/
e http://framework.zend.com/issues/browse/ZF-5840

Estou vendo que eu não tenho muitas opções mesmo, a não ser extender
uma classe que possui a tal action, algo assim:

class AppController extends Zend_Controller_Action {
public function memberFunction() {
// a resuable function
}
}

class FirstController extends AppController {
public function indexAction() {
// call function from any child class
$this->memberFunction();
}
}

Essa solução foi proposta pelo
http://stackoverflow.com/questions/886291/calling-member-function-of-other-controller-in-zend-framework.

Ainda assim, estou vendo se há outros caminhos possíveis ao invés de
extender a classe.

Abraço, cara.

Filipe Mota

unread,
Apr 27, 2012, 3:14:51 PM4/27/12
to zfbr...@googlegroups.com
É um boa opção sim.
E realmente sem o action helper você não tem como fugir.

Não tenho tanta experiencia com o zend assim e não peguei um problema desse tipo ainda,
a unica solução que me veio em mente foi mesmo o helper.

Vlw pelos links, são bem interessantes =)

Rafael Rocha

unread,
Apr 27, 2012, 3:18:13 PM4/27/12
to zfbr...@googlegroups.com
A lógica comum eu crio classe ou helper. Conceito DRY.

--
Essa mensagem faz parte do grupo "zfbrasil" no Google Groups.
Para escrever neste grupo, envie um email para zfbr...@googlegroups.com
Para se desligar do grupo, envie um email para zfbrasil-u...@googlegroups.com
Mais informações, visite o grupo em http://groups.google.com/group/zfbrasil?hl=pt-BR



--
Atenciosamente, 
Rafael Rocha
Analista de sistemas
MSN, GTalk: raf...@gmail.com
Twitter: @rafael_orocha


Vinicius Schlup

unread,
May 29, 2012, 12:47:39 PM5/29/12
to zfbr...@googlegroups.com
Olá Vegetus,

basta chamar no controller o método "action" da view. Ex:

$this->view->action( 'action', 'controller', 'modulo', array_de_parametros );

Isso irá processar a view ligada ao action que vc chamar e retornará o conteúdo em uma string, aí basta usar da maneira que for apropriada para você.

Att.
Vinicius Schlup
Wiidoo Tecnologia

On Friday, April 27, 2012 4:18:13 PM UTC-3, Rafael Rocha wrote:
> A lógica comum eu crio classe ou helper. Conceito DRY.
>
>
> Em 27 de abril de 2012 16:14, Filipe Mota <span dir="ltr">&lt;<a href="mailto:filip...@gmail.com" target="_blank">filip...@gmail.com</a>&gt;</span> escreveu:
>
>
> <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
> É um boa opção sim.</div>
> E realmente sem o action helper você não tem como fugir.</div>
>
>
>
> </div>
> Não tenho tanta experiencia com o zend assim e não peguei um problema desse tipo ainda,</div>
>
> a unica solução que me veio em mente foi mesmo o helper.</div>
>
> </div>
> Vlw pelos links, são bem interessantes =)</div>
>
>
>
>
>
>
> </div>--
> <img style="margin-top:0px;margin-right:0.2ex;margin-bottom:0px;margin-left:0.2ex;vertical-align:middle"> <img style="margin-top:0px;margin-right:0.2ex;margin-bottom:0px;margin-left:0.2ex;vertical-align:middle"> <img style="margin-top:0px;margin-right:0.2ex;margin-bottom:0px;margin-left:0.2ex;vertical-align:middle">  <img style="margin-top:0px;margin-right:0.2ex;margin-bottom:0px;margin-left:0.2ex;vertical-align:middle"> 
>
>
>
>
> </div>
>
>
> </p></div>
>
>
>
> --
>
> Essa mensagem faz parte do grupo &quot;zfbrasil&quot; no Google Groups.
>
> Para escrever neste grupo, envie um email para <a href="mailto:zfbr...@googlegroups.com" target="_blank">zfbr...@googlegroups.com</a>
>
> Para se desligar do grupo, envie um email para <a href="mailto:zfbrasil-u...@googlegroups.com" target="_blank">zfbrasil-unsubscribe@<WBR>googlegroups.com</a>
>
> Mais informações, visite o grupo em <a href="http://groups.google.com/group/zfbrasil?hl=pt-BR" target="_blank">http://groups.google.com/<WBR>group/zfbrasil?hl=pt-BR</a></div></div></blockquote></div>
>
>
>
>
>
> </div>--
> Atenciosamente, 
> Rafael Rocha</div>
> Analista de sistemas</div>
> MSN, GTalk: <a href="mailto:raf...@gmail.com" target="_blank">raf...@gmail.com</a></div>
> Twitter: @rafael_orocha</div>
> <a href="https://rafaelti.wordpress.com/" target="_blank">https://rafaelti.wordpress.<WBR>com/</a></div>
>
>
> <span style="font-family:Georgia,Times,serif;font-size:13px;line-height:19px"><a rel="nofollow" href="https://divulgacaoufmg.wordpress.com/" style="color:blue!important;text-decoration:underline!important" target="_blank">https://divulgacaoufmg.<WBR>wordpress.com</a></span></div>
>
>
> <a href="http://br.linkedin.com/pub/rafael-rocha/26/742/129" target="_blank">http://br.linkedin.com/pub/<WBR>rafael-rocha/26/742/129</a></div><font face="arial, sans-serif"><span style="border-collapse:collapse">
> </span></font>
>
>
>
> </div>

Arthur Cláudio Almeida Pereira

unread,
May 29, 2012, 2:36:10 PM5/29/12
to zfbr...@googlegroups.com
Fala Vegetus, 

 Acredito que você tenha se enganado. O Zend possui algumas categorias de 'helpers' os que eu conheço são: "Action Helpers" e "View Helpers". 
  Os Actions Helpers são classes que você pode adicionar código comum a todas as suas actions. 
  Os Views Helpers são classes que você pode adicionar código comum a todas as suas views. http://framework.zend.com/manual/1.11/en/zend.view.helpers.html
 
Dentro da categoria View Helper existe um helper específico chamado: Action View Helper:  

O link que você postou faz referência ao Action VIEW Helper e não há um Action Helper. 
Entendeu a diferença?


abraços



--
Essa mensagem faz parte do grupo "zfbrasil" no Google Groups.
Para escrever neste grupo, envie um email para zfbr...@googlegroups.com
Para se desligar do grupo, envie um email para zfbrasil-u...@googlegroups.com
Mais informações, visite o grupo em http://groups.google.com/group/zfbrasil?hl=pt-BR

Vegetus

unread,
Jun 6, 2012, 2:29:27 PM6/6/12
to Zend Framework Brasil, rageo...@gmail.com, arthur.alm...@gmail.com
Vinicius e Arthur,

Obrigado pelo retorno. Consegui chamar a action em outro controller
apenas chamando a função proposta pelo Vinicius:

$this->view->action('nomeDaAcao', 'nomeDoController', 'nomeDoModulo',
array(params)); na parte controller
$this->action('nomeDaAcao', 'nomeDoController', 'nomeDoModulo',
array(params)); na parte view

Entretanto, pesquisando melhor no artigo referido, essa técnica NÃO É
RECOMENDADA por questões de desempenho. Segundo o artigo: "Este
técnica basicamente cria um dispatch adicional, copia um objeto de
request e cria um loop dentro da loop. A criação dessa técnica é
dispendioso para o sistema. Qualquer pessoa que tenha realizado um
profilling do seu código terá visto o quanto essa técnica consome
muito recurso da aplicação. Portanto, criando um dispatch extra deve
ser uma má idéia e até mesmo o Zend Framework observa esse fato."

Artigo referido: http://www.rmauger.co.uk/2009/03/why-the-zend-framework-actionstack-is-evil/

Arthur,

Realmente eu tinha me enganado. Os actions * VIEWS * helper não são
recomendados.

Vinicius,

De qualquer forma, agradeço muito pela resposta. Continue postando a
sua resposta, mesmo que ela possa não ser recomendada.

Um abraço.

On 29 maio, 15:36, Arthur Cláudio Almeida Pereira
<arthur.almeidapere...@gmail.com> wrote:
> Fala Vegetus,
>
>  Acredito que você tenha se enganado. O Zend possui algumas categorias de
> 'helpers' os que eu conheço são: "Action Helpers" e "View Helpers".
>   Os Actions Helpers são classes que você pode adicionar código comum a
> todas as suas actions.http://framework.zend.com/manual/en/zend.controller.actionhelpers.html
>   Os Views Helpers são classes que você pode adicionar código comum a todas
> as suas views.http://framework.zend.com/manual/1.11/en/zend.view.helpers.html
>
> Dentro da categoria View Helper existe um helper específico chamado: Action
> View Helper:
>  Nesse link você encontra a explicação dele:http://framework.zend.com/manual/1.11/en/zend.view.helpers.html#zend....
>
> O link que você postou faz referência ao Action *VIEW *Helper e não há um
> Action Helper.
> Entendeu a diferença?
>
> abraços
>
> Em 29 de maio de 2012 13:47, Vinicius Schlup <rageon....@gmail.com>escreveu:
>
>
>
>
>
>
>
> > Olá Vegetus,
>
> > basta chamar no controller o método "action" da view. Ex:
>
> > $this->view->action( 'action', 'controller', 'modulo', array_de_parametros
> > );
>
> > Isso irá processar a view ligada ao action que vc chamar e retornará o
> > conteúdo em uma string, aí basta usar da maneira que for apropriada para
> > você.
>
> > Att.
> > Vinicius Schlup
> > Wiidoo Tecnologia
>
> > On Friday, April 27, 2012 4:18:13 PM UTC-3, Rafael Rocha wrote:
> > > A lógica comum eu crio classe ou helper. Conceito DRY.
>
> > > Em 27 de abril de 2012 16:14, Filipe Mota <span dir="ltr">&lt;<a
> > href="mailto:filipe.m...@gmail.com" target="_blank">filipe.m...@gmail.com</a>&gt;</span>
> > escreveu:
>
> > > <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px
> > #ccc solid;padding-left:1ex">
> > > É um boa opção sim.</div>
> > > E realmente sem o action helper você não tem como fugir.</div>
>
> > > </div>
> > > Não tenho tanta experiencia com o zend assim e não peguei um problema
> > desse tipo ainda,</div>
>
> > > a unica solução que me veio em mente foi mesmo o helper.</div>
>
> > > </div>
> > > Vlw pelos links, são bem interessantes =)</div>
>
> > > </div>--
> > > <img
> > style="margin-top:0px;margin-right:0.2ex;margin-bottom:0px;margin-left:0.2e x;vertical-align:middle"> <img
> > style="margin-top:0px;margin-right:0.2ex;margin-bottom:0px;margin-left:0.2e x;vertical-align:middle"> <img
> > style="margin-top:0px;margin-right:0.2ex;margin-bottom:0px;margin-left:0.2e x;vertical-align:middle">  <img
> > style="margin-top:0px;margin-right:0.2ex;margin-bottom:0px;margin-left:0.2e x;vertical-align:middle">

Felipe Rodrigues

unread,
Jun 6, 2012, 4:38:21 PM6/6/12
to zfbr...@googlegroups.com
" Os actions * VIEWS * helper não são
recomendados."

Chamar os metodos das views não é recomendado?

Alguém pode explicar isso um pouco melhor?

Raphael Almeida

unread,
Jun 9, 2012, 9:49:27 PM6/9/12
to zfbr...@googlegroups.com

Vegetus

unread,
Jun 11, 2012, 12:48:17 PM6/11/12
to Zend Framework Brasil
Felipe,

Os actions views helpers são métodos que permitem receber resposta de
qualquer ação em qualquer controlador em qualquer módulo. Os actions
views helpers são métodos denominados da seguinte maneira:

$string = $this->view->action('nomeDaAcao', 'nomeDoController',
'nomeDoModulo', array(params)); na parte controller

Quando você usa esse método, você estará subestimando o desempenho do
servidor, desperdiçando a memória e os recursos gerais, pois esse
método cria um dispatch adicional, copia um objeto request e gera um
loop dentro do loop, para assim, então retornar o resultado da action.

Esclarecendo:
* os views helpers são recomendados.
* os actions helpers são recomendados.
* os actions views helpers NÃO são recomendados.

Espero ter esclarecido melhor. Qualquer dúvida, nos pergunte à
vontade.

Raphael,

Um simples _foward() não resolve. Porque eu gostaria de recuperar as
informações de uma action, para assim, eu poder acrescentar novas
informações ou manipular os dados. Por exemplo, executando o método:

$string = $this->_foward('contato, 'index, 'default');

...esse método não retornará nenhum resultado à variável $string.
Simplesmente o método vai "redirecionar internamente" à página
desejada, sem enviar o cabeçalho ao navegador, e nada mais, portanto,
o endereço da url não muda. Já que o $this->redirect() envia o
cabeçalho ao navegador, mudando a url, dando mais transparência ao
usuário.

Para que a variável $string possa receber informação em qualquer
action, para manipular os dados, o ideal, mas NÃO RECOMENDADO, aplicar
o action view helper:

$string = $this->view->action('nomeDaAcao', 'nomeDoController',
'nomeDoModulo', array(params)); na parte controller

Dessa forma, receberei o resultado da ação. Alternativamente, pensei
em aplicar uma herança em um controller pai para receber resultado de
alguma action, de modo a não desperdiçar os recursos do servidor. Mas
ainda não sei se é uma boa prática.

Qualquer dúvida, por favor, nos pergunte.

Abrs.

On Jun 9, 10:49 pm, Raphael Almeida <jaguarn...@gmail.com> wrote:
> Um simples _forward()não resolve? Que eu me lembre não rola um novo
> dispatch.http://framework.zend.com/manual/en/zend.controller.action.html
>
> --
> []ão,
>
> Raphael de Almeida
>
> http://raphaeldealmeida.nethttp://www.twitter.com/raph_almeidahttp://rubyonrio.org|http://phprio.org|http://androidinrio.com.br<http://www.androidinrio.com.br/blog/>
>  http://www.arduinrio.cc|http://dojorio.org

Ademir Mazer Jr

unread,
Jun 11, 2012, 1:15:11 PM6/11/12
to zfbr...@googlegroups.com
Construa a arquitetura de sua aplicação utilizando camadas de domínio e de serviços ... assim, se vc precisa reaproveitar uma regra de negócio em vários controllers, basta chamar os objetos de domínio ... caso queira orquestrar serviços diferentes em um controller, chame os serviços que também utilizam a camada de domínio ... dê uma olhada nesta página ...

http://martinfowler.com/eaaCatalog/serviceLayer.html

abraços

--------------------------------------------------------------------------------------------------------------------------------
 Ademir Mazer Jr 
Software Engineer - Owner

Winponta - http://www.winponta.com.br

 
ademir....@gmail.com |  http://ademir.winponta.com.br 
--------------------------------------------------------------------------------------------------------------------------------


Vegetus

unread,
Jun 12, 2012, 10:35:06 AM6/12/12
to Zend Framework Brasil
Ademir,

Obrigado pelo retorno. A sua sugestão me interessou muito e, de fato,
é muito boa para reaproveitar as regras de negócio em vários tipos
esferas possíveis.

Entretanto, no meu caso, estava somente precisando pegar o resultado
de uma action em outro controller. Não é algo que tornaria repetido em
todos os controllers, pois somente foi um caso excepcional.

Abrs.

On Jun 11, 2:15 pm, Ademir Mazer Jr <ademir.mazer...@gmail.com> wrote:
> Construa a arquitetura de sua aplicação utilizando camadas de domínio e de
> serviços ... assim, se vc precisa reaproveitar uma regra de negócio em
> vários controllers, basta chamar os objetos de domínio ... caso queira
> orquestrar serviços diferentes em um controller, chame os serviços que
> também utilizam a camada de domínio ... dê uma olhada nesta página ...
>
> http://martinfowler.com/eaaCatalog/serviceLayer.html
>
> abraços
>
> *
> --------------------------------------------------------------------------- -----------------------------------------------------
> *
> * Ademir Mazer Jr** *
> Software Engineer - Owner
>
> Winponta -http://www.winponta.com.br
>
>  ademir.mazer...@gmail.com |  http://ademir.winponta.com.br
> *
> --------------------------------------------------------------------------- -----------------------------------------------------
> *
> >www.twitter.com/raph_almeidahttp://rubyonrio.org|http://phprio.org|http://androidinrio.com.br<http://www.twitter.com/raph_almeidahttp://rubyonrio.org%7Chttp://phpr...>

analista.carlosh

unread,
Apr 1, 2014, 2:21:17 PM4/1/14
to zfbr...@googlegroups.com
Valew @Vegetus, 

funções dessa forma costume a colocar em Mappers, mas como estou trampando em um projeto já feito e que não pode ser alterado, precisei fazer a mesma coisa que você e funcionou, obrigado.
Reply all
Reply to author
Forward
0 new messages