@@ -38,7 +38,6 @@ class TraceableEventDispatcher implements EventDispatcherInterface, TraceableEve
38
38
private $ dispatcher ;
39
39
private $ wrappedListeners ;
40
40
private $ firstCalledEvent ;
41
- private $ id ;
42
41
private $ lastEventId = 0 ;
43
42
44
43
/**
@@ -125,9 +124,9 @@ public function dispatch($eventName, Event $event = null)
125
124
$ event = new Event ();
126
125
}
127
126
128
- $ this -> id = $ eventId = ++$ this ->lastEventId ;
127
+ $ eventId = ++$ this ->lastEventId ;
129
128
130
- $ this ->preDispatch ($ eventName , $ event );
129
+ $ this ->preDispatch ($ eventName , $ eventId , $ event );
131
130
132
131
$ e = $ this ->stopwatch ->start ($ eventName , 'section ' );
133
132
@@ -139,14 +138,11 @@ public function dispatch($eventName, Event $event = null)
139
138
140
139
$ this ->dispatcher ->dispatch ($ eventName , $ event );
141
140
142
- // reset the id as another event might have been dispatched during the dispatching of this event
143
- $ this ->id = $ eventId ;
144
-
145
141
unset($ this ->firstCalledEvent [$ eventName ]);
146
142
147
143
$ e ->stop ();
148
144
149
- $ this ->postDispatch ($ eventName , $ event );
145
+ $ this ->postDispatch ($ eventName , $ eventId , $ event );
150
146
151
147
return $ event ;
152
148
}
@@ -168,7 +164,7 @@ public function getNotCalledListeners()
168
164
169
165
foreach ($ this ->getListeners () as $ name => $ listeners ) {
170
166
foreach ($ listeners as $ listener ) {
171
- $ info = $ this ->getListenerInfo ($ listener , $ name );
167
+ $ info = $ this ->getListenerInfo ($ listener , null , $ name );
172
168
if (!isset ($ this ->called [$ name .'. ' .$ info ['pretty ' ]])) {
173
169
$ notCalled [$ name .'. ' .$ info ['pretty ' ]] = $ info ;
174
170
}
@@ -198,24 +194,24 @@ public function __call($method, $arguments)
198
194
* Whenever Symfony will require PHP 5.4, this could be changed
199
195
* to a proper private method.
200
196
*/
201
- public function logSkippedListeners ($ eventName , Event $ event , $ listener )
197
+ public function logSkippedListeners ($ eventName , $ eventId , Event $ event , $ listener )
202
198
{
203
199
if (null === $ this ->logger ) {
204
200
return ;
205
201
}
206
202
207
- $ info = $ this ->getListenerInfo ($ listener , $ eventName );
203
+ $ info = $ this ->getListenerInfo ($ listener , $ eventId , $ eventName );
208
204
209
205
$ this ->logger ->debug (sprintf ('Listener "%s" stopped propagation of the event "%s". ' , $ info ['pretty ' ], $ eventName ));
210
206
211
207
$ skippedListeners = $ this ->getListeners ($ eventName );
212
208
$ skipped = false ;
213
209
214
210
foreach ($ skippedListeners as $ skippedListener ) {
215
- $ skippedListener = $ this ->unwrapListener ($ skippedListener );
211
+ $ skippedListener = $ this ->unwrapListener ($ skippedListener, $ eventId );
216
212
217
213
if ($ skipped ) {
218
- $ info = $ this ->getListenerInfo ($ skippedListener , $ eventName );
214
+ $ info = $ this ->getListenerInfo ($ skippedListener , $ eventId , $ eventName );
219
215
$ this ->logger ->debug (sprintf ('Listener "%s" was not called for event "%s". ' , $ info ['pretty ' ], $ eventName ));
220
216
}
221
217
@@ -232,7 +228,7 @@ public function logSkippedListeners($eventName, Event $event, $listener)
232
228
* Whenever Symfony will require PHP 5.4, this could be changed
233
229
* to a proper private method.
234
230
*/
235
- public function preListenerCall ($ eventName , $ listener )
231
+ public function preListenerCall ($ eventName , $ eventId , $ listener )
236
232
{
237
233
// is it the first called listener?
238
234
if (isset ($ this ->firstCalledEvent [$ eventName ])) {
@@ -241,7 +237,7 @@ public function preListenerCall($eventName, $listener)
241
237
unset($ this ->firstCalledEvent [$ eventName ]);
242
238
}
243
239
244
- $ info = $ this ->getListenerInfo ($ listener , $ eventName );
240
+ $ info = $ this ->getListenerInfo ($ listener , $ eventId , $ eventName );
245
241
246
242
if (null !== $ this ->logger ) {
247
243
$ this ->logger ->debug (sprintf ('Notified event "%s" to listener "%s". ' , $ eventName , $ info ['pretty ' ]));
@@ -260,9 +256,9 @@ public function preListenerCall($eventName, $listener)
260
256
*
261
257
* @return array Information about the listener
262
258
*/
263
- private function getListenerInfo ($ listener , $ eventName )
259
+ private function getListenerInfo ($ listener , $ eventId , $ eventName )
264
260
{
265
- $ listener = $ this ->unwrapListener ($ listener );
261
+ $ listener = $ this ->unwrapListener ($ listener, $ eventId );
266
262
267
263
$ info = array (
268
264
'event ' => $ eventName ,
@@ -365,17 +361,17 @@ private function saveInfoInProfile(Profile $profile, $updateChildren)
365
361
}
366
362
}
367
363
368
- private function preDispatch ($ eventName , Event $ event )
364
+ private function preDispatch ($ eventName , $ eventId , Event $ event )
369
365
{
370
366
// wrap all listeners before they are called
371
- $ this ->wrappedListeners [$ this -> id ] = new \SplObjectStorage ();
367
+ $ this ->wrappedListeners [$ eventId ] = new \SplObjectStorage ();
372
368
373
369
$ listeners = $ this ->dispatcher ->getListeners ($ eventName );
374
370
375
371
foreach ($ listeners as $ listener ) {
376
372
$ this ->dispatcher ->removeListener ($ eventName , $ listener );
377
- $ wrapped = $ this ->wrapListener ($ eventName , $ listener );
378
- $ this ->wrappedListeners [$ this -> id ][$ wrapped ] = $ listener ;
373
+ $ wrapped = $ this ->wrapListener ($ eventName , $ eventId , $ listener );
374
+ $ this ->wrappedListeners [$ eventId ][$ wrapped ] = $ listener ;
379
375
$ this ->dispatcher ->addListener ($ eventName , $ wrapped );
380
376
}
381
377
@@ -404,7 +400,7 @@ private function preDispatch($eventName, Event $event)
404
400
}
405
401
}
406
402
407
- private function postDispatch ($ eventName , Event $ event )
403
+ private function postDispatch ($ eventName , $ eventId , Event $ event )
408
404
{
409
405
switch ($ eventName ) {
410
406
case KernelEvents::CONTROLLER :
@@ -433,36 +429,44 @@ private function postDispatch($eventName, Event $event)
433
429
break ;
434
430
}
435
431
436
- foreach ($ this ->wrappedListeners [$ this -> id ] as $ wrapped ) {
432
+ foreach ($ this ->wrappedListeners [$ eventId ] as $ wrapped ) {
437
433
$ this ->dispatcher ->removeListener ($ eventName , $ wrapped );
438
- $ this ->dispatcher ->addListener ($ eventName , $ this ->wrappedListeners [$ this -> id ][$ wrapped ]);
434
+ $ this ->dispatcher ->addListener ($ eventName , $ this ->wrappedListeners [$ eventId ][$ wrapped ]);
439
435
}
440
436
441
- unset($ this ->wrappedListeners [$ this -> id ]);
437
+ unset($ this ->wrappedListeners [$ eventId ]);
442
438
}
443
439
444
- private function wrapListener ($ eventName , $ listener )
440
+ private function wrapListener ($ eventName , $ eventId , $ listener )
445
441
{
446
442
$ self = $ this ;
447
443
448
- return function (Event $ event ) use ($ self , $ eventName , $ listener ) {
449
- $ e = $ self ->preListenerCall ($ eventName , $ listener );
444
+ return function (Event $ event ) use ($ self , $ eventName , $ eventId , $ listener ) {
445
+ $ e = $ self ->preListenerCall ($ eventName , $ eventId , $ listener );
450
446
451
447
call_user_func ($ listener , $ event );
452
448
453
449
$ e ->stop ();
454
450
455
451
if ($ event ->isPropagationStopped ()) {
456
- $ self ->logSkippedListeners ($ eventName , $ event , $ listener );
452
+ $ self ->logSkippedListeners ($ eventName , $ eventId , $ event , $ listener );
457
453
}
458
454
};
459
455
}
460
456
461
- private function unwrapListener ($ listener )
457
+ private function unwrapListener ($ listener, $ eventId )
462
458
{
463
459
// get the original listener
464
- if (is_object ($ listener ) && isset ($ this ->wrappedListeners [$ this ->id ][$ listener ])) {
465
- return $ this ->wrappedListeners [$ this ->id ][$ listener ];
460
+ if (is_object ($ listener )) {
461
+ if (null === $ eventId ) {
462
+ foreach (array_keys ($ this ->wrappedListeners ) as $ eventId ) {
463
+ if (isset ($ this ->wrappedListeners [$ eventId ][$ listener ])) {
464
+ return $ this ->wrappedListeners [$ eventId ][$ listener ];
465
+ }
466
+ }
467
+ } elseif (isset ($ this ->wrappedListeners [$ eventId ][$ listener ])) {
468
+ return $ this ->wrappedListeners [$ eventId ][$ listener ];
469
+ }
466
470
}
467
471
468
472
return $ listener ;
0 commit comments