Como obter o controlador do plugin do controlador no zendframework 2?

Estou escrevendo um plugin do controlador no zf2. Eu uso o seguinte método para obter o controlador dentro do plugin, mas ele retorna nulo.

$controller = $this->getController() 

Alguma sugestão?

Existem duas opções para as quais você não possui nenhum controlador configurado em seu plugin.

  1. Você chama o plugin do gerenciador de plugins antes do envio, então nenhum controlador está configurado ainda
  2. Você chama o controlador dentro do plugin durante __construct()

Para o primeiro, um exemplo típico é um método onBootstrap() em uma class de módulo onde, obviamente, você não possui controlador:

 public function onBootstrap($e) { $app = $e->getApplication(); $sm = $app->getServiceManager(); $plugins = $sm->get('ControllerPluginManager'); $plugin = $plugins->get('my-plugin'); // $plugin->getController() === null } 

Isso parece um exemplo óbvio, mas há outras ocasiões em que você está assumindo erroneamente que existe um controlador já (por exemplo, durante a execução do aplicativo, na fase de rota, o despacho ainda precisa vir).

O segundo exemplo é porque o controlador é injetado com injeção setter. O setter é chamado após a construção. Em pseudo-código, isso acontece:

 $plugin = new $class; $plugin->setController($controller); 

Se você tem um plugin como este:

 use Zend\Mvc\Controller\Plugin\AbstractPlugin; class MyPlugin extends AbstractPlugin { public function __construct() { // $this->getController() === null } } 

Você percebe que não há nenhum controlador definido nessa fase.

Observe que esta resposta foi baseada em minha experiência com o ZF1 e uma rápida análise do código ZF2. Confira esta resposta .

Ainda não joguei com o ZF2, mas se o processo de despacho e os plugins forem semelhantes ao ZF1, um plugin não pode acessar o controlador (pelo menos não de forma trivial), já que o controlador nem mesmo é instanciado para alguns dos ganchos de plugins.

Atualização : olhou rapidamente para alguns dos complementos do controlador de estoque ZF2 (como não consigo encontrar documentos oficiais na criação de um plugin personalizado) e veja verificações como as seguintes :

 $controller = $this->getController(); if (!$controller || !method_exists($controller, 'plugin')) { //... 

Portanto, parece que o controlador não pode ser configurado em alguns casos. Uma vez que os plugins também suportam (o que eu entendo ser) um ouvinte de events, acho que eles ainda podem ser usados ​​em várias ocasiões no processo de resposta, que pode ser antes de atribuir um controlador.

Espero que alguém que use o ZF2 possa vir e me direto ; Mas talvez eu pelo menos tenha apontado você em uma direção razoavelmente razoável.