@@ -35,7 +35,6 @@ class TraceableEventDispatcher implements EventDispatcherInterface, TraceableEve
35
35
private $ dispatcher ;
36
36
private $ wrappedListeners = array ();
37
37
private $ firstCalledEvent = array ();
38
- private $ id ;
39
38
private $ lastEventId = 0 ;
40
39
41
40
/**
@@ -124,9 +123,9 @@ public function dispatch($eventName, Event $event = null)
124
123
$ event = new Event ();
125
124
}
126
125
127
- $ this -> id = $ eventId = ++$ this ->lastEventId ;
126
+ $ eventId = ++$ this ->lastEventId ;
128
127
129
- $ this ->preDispatch ($ eventName , $ event );
128
+ $ this ->preDispatch ($ eventName , $ eventId , $ event );
130
129
131
130
$ e = $ this ->stopwatch ->start ($ eventName , 'section ' );
132
131
@@ -138,16 +137,13 @@ public function dispatch($eventName, Event $event = null)
138
137
139
138
$ this ->dispatcher ->dispatch ($ eventName , $ event );
140
139
141
- // reset the id as another event might have been dispatched during the dispatching of this event
142
- $ this ->id = $ eventId ;
143
-
144
140
unset($ this ->firstCalledEvent [$ eventName ]);
145
141
146
142
if ($ e ->isStarted ()) {
147
143
$ e ->stop ();
148
144
}
149
145
150
- $ this ->postDispatch ($ eventName , $ event );
146
+ $ this ->postDispatch ($ eventName , $ eventId , $ event );
151
147
152
148
return $ event ;
153
149
}
@@ -169,7 +165,7 @@ public function getNotCalledListeners()
169
165
170
166
foreach ($ this ->getListeners () as $ name => $ listeners ) {
171
167
foreach ($ listeners as $ listener ) {
172
- $ info = $ this ->getListenerInfo ($ listener , $ name );
168
+ $ info = $ this ->getListenerInfo ($ listener , null , $ name );
173
169
if (!isset ($ this ->called [$ name .'. ' .$ info ['pretty ' ]])) {
174
170
$ notCalled [$ name .'. ' .$ info ['pretty ' ]] = $ info ;
175
171
}
@@ -199,24 +195,24 @@ public function __call($method, $arguments)
199
195
* Whenever Symfony will require PHP 5.4, this could be changed
200
196
* to a proper private method.
201
197
*/
202
- public function logSkippedListeners ($ eventName , Event $ event , $ listener )
198
+ public function logSkippedListeners ($ eventName , $ eventId , Event $ event , $ listener )
203
199
{
204
200
if (null === $ this ->logger ) {
205
201
return ;
206
202
}
207
203
208
- $ info = $ this ->getListenerInfo ($ listener , $ eventName );
204
+ $ info = $ this ->getListenerInfo ($ listener , $ eventId , $ eventName );
209
205
210
206
$ this ->logger ->debug (sprintf ('Listener "%s" stopped propagation of the event "%s". ' , $ info ['pretty ' ], $ eventName ));
211
207
212
208
$ skippedListeners = $ this ->getListeners ($ eventName );
213
209
$ skipped = false ;
214
210
215
211
foreach ($ skippedListeners as $ skippedListener ) {
216
- $ skippedListener = $ this ->unwrapListener ($ skippedListener );
212
+ $ skippedListener = $ this ->unwrapListener ($ skippedListener, $ eventId );
217
213
218
214
if ($ skipped ) {
219
- $ info = $ this ->getListenerInfo ($ skippedListener , $ eventName );
215
+ $ info = $ this ->getListenerInfo ($ skippedListener , $ eventId , $ eventName );
220
216
$ this ->logger ->debug (sprintf ('Listener "%s" was not called for event "%s". ' , $ info ['pretty ' ], $ eventName ));
221
217
}
222
218
@@ -233,7 +229,7 @@ public function logSkippedListeners($eventName, Event $event, $listener)
233
229
* Whenever Symfony will require PHP 5.4, this could be changed
234
230
* to a proper private method.
235
231
*/
236
- public function preListenerCall ($ eventName , $ listener )
232
+ public function preListenerCall ($ eventName , $ eventId , $ listener )
237
233
{
238
234
// is it the first called listener?
239
235
if (isset ($ this ->firstCalledEvent [$ eventName ])) {
@@ -242,7 +238,7 @@ public function preListenerCall($eventName, $listener)
242
238
unset($ this ->firstCalledEvent [$ eventName ]);
243
239
}
244
240
245
- $ info = $ this ->getListenerInfo ($ listener , $ eventName );
241
+ $ info = $ this ->getListenerInfo ($ listener , $ eventId , $ eventName );
246
242
247
243
if (null !== $ this ->logger ) {
248
244
$ this ->logger ->debug (sprintf ('Notified event "%s" to listener "%s". ' , $ eventName , $ info ['pretty ' ]));
@@ -261,9 +257,9 @@ public function preListenerCall($eventName, $listener)
261
257
*
262
258
* @return array Information about the listener
263
259
*/
264
- private function getListenerInfo ($ listener , $ eventName )
260
+ private function getListenerInfo ($ listener , $ eventId , $ eventName )
265
261
{
266
- $ listener = $ this ->unwrapListener ($ listener );
262
+ $ listener = $ this ->unwrapListener ($ listener, $ eventId );
267
263
268
264
$ info = array (
269
265
'event ' => $ eventName ,
@@ -315,17 +311,17 @@ private function getListenerInfo($listener, $eventName)
315
311
return $ info ;
316
312
}
317
313
318
- private function preDispatch ($ eventName , Event $ event )
314
+ private function preDispatch ($ eventName , $ eventId , Event $ event )
319
315
{
320
316
// wrap all listeners before they are called
321
- $ this ->wrappedListeners [$ this -> id ] = new \SplObjectStorage ();
317
+ $ this ->wrappedListeners [$ eventId ] = new \SplObjectStorage ();
322
318
323
319
$ listeners = $ this ->dispatcher ->getListeners ($ eventName );
324
320
325
321
foreach ($ listeners as $ listener ) {
326
322
$ this ->dispatcher ->removeListener ($ eventName , $ listener );
327
- $ wrapped = $ this ->wrapListener ($ eventName , $ listener );
328
- $ this ->wrappedListeners [$ this -> id ][$ wrapped ] = $ listener ;
323
+ $ wrapped = $ this ->wrapListener ($ eventName , $ eventId , $ listener );
324
+ $ this ->wrappedListeners [$ eventId ][$ wrapped ] = $ listener ;
329
325
$ this ->dispatcher ->addListener ($ eventName , $ wrapped );
330
326
}
331
327
@@ -354,7 +350,7 @@ private function preDispatch($eventName, Event $event)
354
350
}
355
351
}
356
352
357
- private function postDispatch ($ eventName , Event $ event )
353
+ private function postDispatch ($ eventName , $ eventId , Event $ event )
358
354
{
359
355
switch ($ eventName ) {
360
356
case KernelEvents::CONTROLLER :
@@ -374,20 +370,20 @@ private function postDispatch($eventName, Event $event)
374
370
break ;
375
371
}
376
372
377
- foreach ($ this ->wrappedListeners [$ this -> id ] as $ wrapped ) {
373
+ foreach ($ this ->wrappedListeners [$ eventId ] as $ wrapped ) {
378
374
$ this ->dispatcher ->removeListener ($ eventName , $ wrapped );
379
- $ this ->dispatcher ->addListener ($ eventName , $ this ->wrappedListeners [$ this -> id ][$ wrapped ]);
375
+ $ this ->dispatcher ->addListener ($ eventName , $ this ->wrappedListeners [$ eventId ][$ wrapped ]);
380
376
}
381
377
382
- unset($ this ->wrappedListeners [$ this -> id ]);
378
+ unset($ this ->wrappedListeners [$ eventId ]);
383
379
}
384
380
385
- private function wrapListener ($ eventName , $ listener )
381
+ private function wrapListener ($ eventName , $ eventId , $ listener )
386
382
{
387
383
$ self = $ this ;
388
384
389
- return function (Event $ event ) use ($ self , $ eventName , $ listener ) {
390
- $ e = $ self ->preListenerCall ($ eventName , $ listener );
385
+ return function (Event $ event ) use ($ self , $ eventName , $ eventId , $ listener ) {
386
+ $ e = $ self ->preListenerCall ($ eventName , $ eventId , $ listener );
391
387
392
388
call_user_func ($ listener , $ event , $ eventName , $ self );
393
389
@@ -396,16 +392,24 @@ private function wrapListener($eventName, $listener)
396
392
}
397
393
398
394
if ($ event ->isPropagationStopped ()) {
399
- $ self ->logSkippedListeners ($ eventName , $ event , $ listener );
395
+ $ self ->logSkippedListeners ($ eventName , $ eventId , $ event , $ listener );
400
396
}
401
397
};
402
398
}
403
399
404
- private function unwrapListener ($ listener )
400
+ private function unwrapListener ($ listener, $ eventId )
405
401
{
406
402
// get the original listener
407
- if (is_object ($ listener ) && isset ($ this ->wrappedListeners [$ this ->id ][$ listener ])) {
408
- return $ this ->wrappedListeners [$ this ->id ][$ listener ];
403
+ if (is_object ($ listener )) {
404
+ if (null === $ eventId ) {
405
+ foreach (array_keys ($ this ->wrappedListeners ) as $ eventId ) {
406
+ if (isset ($ this ->wrappedListeners [$ eventId ][$ listener ])) {
407
+ return $ this ->wrappedListeners [$ eventId ][$ listener ];
408
+ }
409
+ }
410
+ } elseif (isset ($ this ->wrappedListeners [$ eventId ][$ listener ])) {
411
+ return $ this ->wrappedListeners [$ eventId ][$ listener ];
412
+ }
409
413
}
410
414
411
415
return $ listener ;
0 commit comments