On 10/05/13 23:11, Michael Gooden wrote:
Hi David,
It should not be firing twice, however you are trying to use the
shared event manager the wrong way.
If you want to have a listener fire for EVERY dispatch ever, then just
attach to normal event manager on EVENT_DISPATCH in one place. If you
attach it in the MyModule it will still fire when you access a
controller in the Application module. Is that what you need?
It was more as an experiment to see what would happen. I was more
confused by different tutorials showing listeners being attached to the
EventManager and the SharedEventManager without explaining why one
should be used over the other.
As for firing twice, I agree, that shouldn't be happening, but
Zend\Mvc\Application.php triggers MvcEvent::EVENT_DISPATCH on line 309
and Zend\Mvc\Controller\AbstractController triggers it on line 115.
In my opinion this is a bug, and those should be two separate events,
but there's probably not much that can be done about it now without
breaking BC.
Cheers,
David
Cheers,
Michael
On 10 May 2013 15:01, David Muir <[email protected]
<mailto:[email protected]>> wrote:
Michael,
Thanks for the explanation. It does explain the issue I have having.
So the gist is:
$sharedEvents->attach(__NAMESPACE__, MvcEvent::EVENT_DISPATCH
means that this even will only be triggered if the context is that
namespace. So the one in Application will fire if the context is
"Application" and the one in MyModule will fire if the context is
"MyModule".
So as an experiment, in Application I tried attaching a listener
to 'MyModule' instead of __NAMESPACE__ and it work as expected. It
only fires when hitting a controller in MyModule.
But what if I want to attach something that is triggered in all
contexts on the dispatch event? I tried using the * wildcard, but
now the shared listeners get hit twice:
shared event listener from application module called
shared event listener from my module called
event listener from application module called
event listener from my module called
shared event listener from application module called
shared event listener from my module called
If my understanding is correct, this happens because there are two
EventManager involved. First is the Application's EventManager,
which first triggers the shared events, then triggers the local
events. Then the controller itself triggers
MvcEvent::EVENT_DISPATCH on its own EventManager instance when the
controller's dispatch() method gets called. This in turn triggers
the shared events a 2nd time.
I guess I got exactly what I asked for, but wasn't
expecting MvcEvent::EVENT_DISPATCH to be triggered twice. Kind of
feels wrong...
Cheers,
David
On 10/05/2013, at 4:46 PM, Michael Gooden
<[email protected] <mailto:[email protected]>> wrote:
Hi David,
Keep in mind that you are working with the Zend\Mvc\Application's
EventManager instance. Try and follow the code execution in the
Application::run() function, to see when and why different events
fire.
I would hazard a guess and say that you are accessing a
controller in the MyModule, and not in the main Application
module. If you run a controller from the Application module, you
will then see the 'shared event from application' message show
instead of from mymodule. The reason this is happening is because
the shared event manager listener you are attaching is listening
for the event identifier of __NAMESPACE__. When the dispatch
event gets called against a controller under MyModule, only the
listener tied to the namespace of that controller will be fired.
The reason you will always see both normal event listener
messages is because those listeners are both attached to the
dispatch event.
I feel I am failing at explaining this, can you add me on Skype?
Cheers,
Michael Gooden
On 10 May 2013 03:41, David Muir <[email protected]
<mailto:[email protected]>> wrote:
I'm getting some weird behaviour with the EventManager and
SharedEventManager when used in the Application module vs
other modules.
Application Module:
public function onBootstrap(MvcEvent $e)
{
//$e->getApplication()->getServiceManager()->get('translator');
$eventManager =
$e->getApplication()->getEventManager();
$moduleRouteListener = new ModuleRouteListener();
$moduleRouteListener->attach($eventManager);
$eventManager->attach(MvcEvent::EVENT_DISPATCH, function
($event){
echo 'event listener from application module
called' . PHP_EOL;
});
$sharedEvents = $eventManager->getSharedManager();
$sharedEvents->attach(__NAMESPACE__,
MvcEvent::EVENT_DISPATCH, function ($event){
echo 'shared event listener from application
module called'. PHP_EOL;
});
}
My Module:
public function onBootstrap(\Zend\EventManager\EventInterface $e)
{
$eventManager =
$e->getApplication()->getEventManager();
$sharedEvents = $eventManager-> getSharedManager();
$eventManager->attach(MvcEvent::EVENT_DISPATCH, function
($event){
echo 'event listener from my module called'.PHP_EOL;
});
$sharedEvents->attach(__NAMESPACE__,
MvcEvent::EVENT_DISPATCH, function ($event){
echo 'shared event listener from my module
called'.PHP_EOL;
});
}
outputs:
shared event listener from my module called
event listener from application module called
event listener from my module called
Can someone explain why the shared event listener attached
via the Application module never gets called?
Secondary to this, I've seen some examples attach listeners
to the shared manager, and others attach them to the event
manager. When do I use one instead of the other?
Cheers,
David
--
List: [email protected]
<mailto:[email protected]>
Info: http://framework.zend.com/archives
Unsubscribe: [email protected]
<mailto:[email protected]>