@@ -32,7 +32,6 @@ class TraceableEventDispatcher implements TraceableEventDispatcherInterface
3232 private $ dispatcher ;
3333 private $ wrappedListeners = array ();
3434 private $ firstCalledEvent = array ();
35- private $ id ;
3635 private $ lastEventId = 0 ;
3736
3837 /**
@@ -106,17 +105,17 @@ public function dispatch($eventName, Event $event = null)
106105 $ event = new Event ();
107106 }
108107
109- $ this -> id = $ eventId = ++$ this ->lastEventId ;
108+ $ eventId = ++$ this ->lastEventId ;
110109
111110 // Wrap all listeners before they are called
112- $ this ->wrappedListeners [$ this -> id ] = new \SplObjectStorage ();
111+ $ this ->wrappedListeners [$ eventId ] = new \SplObjectStorage ();
113112
114113 $ listeners = $ this ->dispatcher ->getListeners ($ eventName );
115114
116115 foreach ($ listeners as $ listener ) {
117116 $ this ->dispatcher ->removeListener ($ eventName , $ listener );
118- $ wrapped = $ this ->wrapListener ($ eventName , $ listener );
119- $ this ->wrappedListeners [$ this -> id ][$ wrapped ] = $ listener ;
117+ $ wrapped = $ this ->wrapListener ($ eventName , $ eventId , $ listener );
118+ $ this ->wrappedListeners [$ eventId ][$ wrapped ] = $ listener ;
120119 $ this ->dispatcher ->addListener ($ eventName , $ wrapped );
121120 }
122121
@@ -132,9 +131,6 @@ public function dispatch($eventName, Event $event = null)
132131
133132 $ this ->dispatcher ->dispatch ($ eventName , $ event );
134133
135- // reset the id as another event might have been dispatched during the dispatching of this event
136- $ this ->id = $ eventId ;
137-
138134 unset($ this ->firstCalledEvent [$ eventName ]);
139135
140136 if ($ e ->isStarted ()) {
@@ -144,12 +140,12 @@ public function dispatch($eventName, Event $event = null)
144140 $ this ->postDispatch ($ eventName , $ event );
145141
146142 // Unwrap all listeners after they are called
147- foreach ($ this ->wrappedListeners [$ this -> id ] as $ wrapped ) {
143+ foreach ($ this ->wrappedListeners [$ eventId ] as $ wrapped ) {
148144 $ this ->dispatcher ->removeListener ($ eventName , $ wrapped );
149- $ this ->dispatcher ->addListener ($ eventName , $ this ->wrappedListeners [$ this -> id ][$ wrapped ]);
145+ $ this ->dispatcher ->addListener ($ eventName , $ this ->wrappedListeners [$ eventId ][$ wrapped ]);
150146 }
151147
152- unset($ this ->wrappedListeners [$ this -> id ]);
148+ unset($ this ->wrappedListeners [$ eventId ]);
153149
154150 return $ event ;
155151 }
@@ -171,7 +167,7 @@ public function getNotCalledListeners()
171167
172168 foreach ($ this ->getListeners () as $ name => $ listeners ) {
173169 foreach ($ listeners as $ listener ) {
174- $ info = $ this ->getListenerInfo ($ listener , $ name );
170+ $ info = $ this ->getListenerInfo ($ listener , $ name, null );
175171 if (!isset ($ this ->called [$ name .'. ' .$ info ['pretty ' ]])) {
176172 $ notCalled [$ name .'. ' .$ info ['pretty ' ]] = $ info ;
177173 }
@@ -201,24 +197,24 @@ public function __call($method, $arguments)
201197 * Whenever Symfony will require PHP 5.4, this could be changed
202198 * to a proper private method.
203199 */
204- public function logSkippedListeners ($ eventName , Event $ event , $ listener )
200+ public function logSkippedListeners ($ eventName , $ eventId , Event $ event , $ listener )
205201 {
206202 if (null === $ this ->logger ) {
207203 return ;
208204 }
209205
210- $ info = $ this ->getListenerInfo ($ listener , $ eventName );
206+ $ info = $ this ->getListenerInfo ($ listener , $ eventName, $ eventId );
211207
212208 $ this ->logger ->debug (sprintf ('Listener "%s" stopped propagation of the event "%s". ' , $ info ['pretty ' ], $ eventName ));
213209
214210 $ skippedListeners = $ this ->getListeners ($ eventName );
215211 $ skipped = false ;
216212
217213 foreach ($ skippedListeners as $ skippedListener ) {
218- $ skippedListener = $ this ->unwrapListener ($ skippedListener );
214+ $ skippedListener = $ this ->unwrapListener ($ skippedListener, $ eventId );
219215
220216 if ($ skipped ) {
221- $ info = $ this ->getListenerInfo ($ skippedListener , $ eventName );
217+ $ info = $ this ->getListenerInfo ($ skippedListener , $ eventName, $ eventId );
222218 $ this ->logger ->debug (sprintf ('Listener "%s" was not called for event "%s". ' , $ info ['pretty ' ], $ eventName ));
223219 }
224220
@@ -235,7 +231,7 @@ public function logSkippedListeners($eventName, Event $event, $listener)
235231 * Whenever Symfony will require PHP 5.4, this could be changed
236232 * to a proper private method.
237233 */
238- public function preListenerCall ($ eventName , $ listener )
234+ public function preListenerCall ($ eventName , $ eventId , $ listener )
239235 {
240236 // is it the first called listener?
241237 if (isset ($ this ->firstCalledEvent [$ eventName ])) {
@@ -244,7 +240,7 @@ public function preListenerCall($eventName, $listener)
244240 unset($ this ->firstCalledEvent [$ eventName ]);
245241 }
246242
247- $ info = $ this ->getListenerInfo ($ listener , $ eventName );
243+ $ info = $ this ->getListenerInfo ($ listener , $ eventName, $ eventId );
248244
249245 if (null !== $ this ->logger ) {
250246 $ this ->logger ->debug (sprintf ('Notified event "%s" to listener "%s". ' , $ eventName , $ info ['pretty ' ]));
@@ -263,9 +259,9 @@ public function preListenerCall($eventName, $listener)
263259 *
264260 * @return array Information about the listener
265261 */
266- private function getListenerInfo ($ listener , $ eventName )
262+ private function getListenerInfo ($ listener , $ eventName, $ eventId )
267263 {
268- $ listener = $ this ->unwrapListener ($ listener );
264+ $ listener = $ this ->unwrapListener ($ listener, $ eventId );
269265
270266 $ info = array (
271267 'event ' => $ eventName ,
@@ -337,12 +333,12 @@ protected function postDispatch($eventName, Event $event)
337333 {
338334 }
339335
340- private function wrapListener ($ eventName , $ listener )
336+ private function wrapListener ($ eventName , $ eventId , $ listener )
341337 {
342338 $ self = $ this ;
343339
344- return function (Event $ event ) use ($ self , $ eventName , $ listener ) {
345- $ e = $ self ->preListenerCall ($ eventName , $ listener );
340+ return function (Event $ event ) use ($ self , $ eventName , $ eventId , $ listener ) {
341+ $ e = $ self ->preListenerCall ($ eventName , $ eventId , $ listener );
346342
347343 call_user_func ($ listener , $ event , $ eventName , $ self );
348344
@@ -351,16 +347,24 @@ private function wrapListener($eventName, $listener)
351347 }
352348
353349 if ($ event ->isPropagationStopped ()) {
354- $ self ->logSkippedListeners ($ eventName , $ event , $ listener );
350+ $ self ->logSkippedListeners ($ eventName , $ eventId , $ event , $ listener );
355351 }
356352 };
357353 }
358354
359- private function unwrapListener ($ listener )
355+ private function unwrapListener ($ listener, $ eventId )
360356 {
361357 // get the original listener
362- if (is_object ($ listener ) && isset ($ this ->wrappedListeners [$ this ->id ][$ listener ])) {
363- return $ this ->wrappedListeners [$ this ->id ][$ listener ];
358+ if (is_object ($ listener )) {
359+ if (null === $ eventId ) {
360+ foreach (array_keys ($ this ->wrappedListeners ) as $ eventId ) {
361+ if (isset ($ this ->wrappedListeners [$ eventId ][$ listener ])) {
362+ return $ this ->wrappedListeners [$ eventId ][$ listener ];
363+ }
364+ }
365+ } elseif (isset ($ this ->wrappedListeners [$ eventId ][$ listener ])) {
366+ return $ this ->wrappedListeners [$ eventId ][$ listener ];
367+ }
364368 }
365369
366370 return $ listener ;
0 commit comments