php - ZF2 events for multiple modules -


currently have zf2 application configured single module "application". bootstrap application attach event way:

namespace application;  use zend\mvc\moduleroutelistener; use zend\mvc\mvcevent;  class module {     public function onbootstrap( mvcevent $e)     {         $eventmanager        = $e->getapplication()->geteventmanager();         $moduleroutelistener = new moduleroutelistener();         $moduleroutelistener->attach( $eventmanager);          $this->inittracking( $e);     }      /**      * initialises user tracking check      * @param mvcevent $e      */     public function inittracking( mvcevent $e)      {         $eventmanager = $e->getapplication()->geteventmanager();         $eventmanager->attach( 'dispatch', function( $e){              $objtracking = new \application\event\tracking( $e);         }, 200);     } } 

now need create new module "api", should process urls starting domain.com/api (i configure router in "api" module config file handle such urls). bootstrap "api" module same way "application" module, , attach dedicated event:

namespace api;  use zend\mvc\moduleroutelistener; use zend\mvc\mvcevent;  class module {     public function onbootstrap( mvcevent $e)     {         $eventmanager        = $e->getapplication()->geteventmanager();         $moduleroutelistener = new moduleroutelistener();         $moduleroutelistener->attach( $eventmanager);          $this->initlogging( $e);     }      /**      * initialises loggging      * @param mvcevent $e      */     public function initlogging( mvcevent $e)      {         $eventmanager = $e->getapplication()->geteventmanager();         $eventmanager->attach( 'dispatch', function( $e){              $objlogger = new \application\event\logging( $e);         }, 200);     } } 

what happens when call domain.com/application - both modules being initialised , events both modules being triggered. need events triggered depending on application dispatching action.

how can achieve that?

you attaching event listeners application event manager. single event manager instance trigger mvc events.

as same instance make no difference where attach listeners; triggered regardless.

you need check, in each listener, if matched route 1 listener should action. if not exit out early.

for example:

public function onbootstrap(mvcevent $event) {     $eventmanager = $event->getapplication()->geteventmanager();      // there no need pass in event      // seperate function can attach 'initlogging' here     // event listener     $eventmanager->attach('dispatch', array($this, 'initlogging'), 200); }  // initlogging listener public function initlogging(mvcevent $event) {     //... check route 1 want     // quite basic might need edit     // suit specific needs      $routename = $event->getroutematch()->getmatchedroutename();      if (false === strpos($routename, 'api')) {         // not api route exit         return;     }     $objlogger = new \application\event\logging($event); } 

so listener still triggered, won't 'do' anything.

you can go further , prevent unnecessary call targeting required event manager interested in; can use sharedeventmanager.

when attaching listener sharedeventmanager need provide 'identifier' of target event manager - i'll assume targeting 'api controller'.

so above changed to

public function onbootstrap(mvcevent $event) {     $application = $event->getapplication();     $sharedeventmanager = $application->geteventmanager()                                       ->getsharedmanager();      // shared event manager takes 1 additional argument,     // 'api\controller\index' our target identifier     $eventmanager->attach('api\controller\index', 'dispatch', array($this, 'initlogging'), 200); }  // initlogging listener public function initlogging(mvcevent $event) {     // ... same bits had before } 

Comments

Popular posts from this blog

java - Oracle EBS .ClassNotFoundException: oracle.apps.fnd.formsClient.FormsLauncher.class ERROR -

c# - how to use buttonedit in devexpress gridcontrol -

nvd3.js - angularjs-nvd3-directives setting color in legend as well as in chart elements -