2013-05-17 20 views
7

Sto riscontrando un problema nel far scattare un evento. Ecco il mio codice ...ZF2 Event Trigger

controller.php

function get($id) 
{ 
    $this->getEventManager()->trigger('hmac.check'); 
} 

Quando questo trigger è stato eseguito non verrà eseguito l'evento hmac.check anche se è collegato.

module.php

class Module 
{ 
    /** 
    * Init the methods 
    * 
    * @param ModuleManager $moduleManager 
    */ 
    public function init(ModuleManager $mm) 
    { 
     $mm->getEventManager() 
      ->attach(
       'hmac.check', 
       function(MvcEvent $evt) 
       { 
        echo "The trigger has worked"; 
        $key = $evt->getParams()->fromHeader('key'); 
        $ts = $evt->getParams()->fromHeader('when'); 
        $uri = $evt->getParams()->fromHeader('uri'); 

        $hmac = new \Scc\Hmac\Hmac(new HmacConfig, new HmacStorage); 
       } 
     ); 
    } 
} 

Se mi associo un messaggio prima o dopo il $ mm-> getEventManager-> attach(); visualizza il test fine, quindi so che sta eseguendo il metodo init.

qualsiasi aiuto con questo sarebbe grande.

Grazie in anticipo

EDIT: Questo è un controller riposante se questo fa alcuna differenza (non credo che lo fa).

risposta

9

Il problema è che si stanno collegando gli ascoltatori all'istanza s EventManager e non all'Event Manager principale Application.

Non c'è modo di collegarsi all'Evento EventManager direttamente dal modulo init(), il gestore del modulo non ha accesso ad esso, quindi è necessario ottenere il SharedManager da EventManager di ModuleManager e collegare i listener di eventi a tale .

Ecco un esempio di farlo ascoltando l'evento hmac.check quando innescato da qualsiasi controller che si estende Zend\Mvc\Controller\AbstractRestfulController, ma si poteva ascoltare un controller specifico, sostituendo quello con i controller FQCN invece.

class Module 
{ 
    /** 
    * Init the methods 
    * 
    * @param ModuleManager $moduleManager 
    */ 
    public function init(ModuleManager $mm) 
    { 
     $mm->getEventManager()->getSharedManager() 
      ->attach(
       'Zend\Mvc\Controller\AbstractRestfulController', 'hmac.check', 
       function(MvcEvent $evt) 
       { 
        echo "The trigger has worked"; 
        $key = $evt->getParams()->fromHeader('key'); 
        $ts = $evt->getParams()->fromHeader('when'); 
        $uri = $evt->getParams()->fromHeader('uri'); 

        $hmac = new \Scc\Hmac\Hmac(new HmacConfig, new HmacStorage); 
       } 
     ); 
    } 
} 
+2

grazie, che funziona un piacere :) – mic

+1

Come hai ottenuto questo lavoro? Ho ricevuto il seguente errore: l'argomento 1 passato alla chiusura deve essere un'istanza di Zend \ Mvc \ MvcEvent, istanza di Zend \ ModuleManager \ ModuleEvent fornita – emolah

+1

@emolah, se stai ricevendo un'istanza ModuleEvent, posso solo supporre che tu abbia copiato il codice utilizzato nella domanda, invece del codice indicato nella risposta. – Crisp