@@ -32,7 +32,6 @@ class TraceableEventDispatcher implements TraceableEventDispatcherInterface
32
32
private $ dispatcher ;
33
33
private $ wrappedListeners = array ();
34
34
private $ firstCalledEvent = array ();
35
- private $ id ;
36
35
private $ lastEventId = 0 ;
37
36
38
37
/**
@@ -106,17 +105,17 @@ public function dispatch($eventName, Event $event = null)
106
105
$ event = new Event ();
107
106
}
108
107
109
- $ this -> id = $ eventId = ++$ this ->lastEventId ;
108
+ $ eventId = ++$ this ->lastEventId ;
110
109
111
110
// Wrap all listeners before they are called
112
- $ this ->wrappedListeners [$ this -> id ] = new \SplObjectStorage ();
111
+ $ this ->wrappedListeners [$ eventId ] = new \SplObjectStorage ();
113
112
114
113
$ listeners = $ this ->dispatcher ->getListeners ($ eventName );
115
114
116
115
foreach ($ listeners as $ listener ) {
117
116
$ 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 ;
120
119
$ this ->dispatcher ->addListener ($ eventName , $ wrapped );
121
120
}
122
121
@@ -132,9 +131,6 @@ public function dispatch($eventName, Event $event = null)
132
131
133
132
$ this ->dispatcher ->dispatch ($ eventName , $ event );
134
133
135
- // reset the id as another event might have been dispatched during the dispatching of this event
136
- $ this ->id = $ eventId ;
137
-
138
134
unset($ this ->firstCalledEvent [$ eventName ]);
139
135
140
136
if ($ e ->isStarted ()) {
@@ -144,12 +140,12 @@ public function dispatch($eventName, Event $event = null)
144
140
$ this ->postDispatch ($ eventName , $ event );
145
141
146
142
// Unwrap all listeners after they are called
147
- foreach ($ this ->wrappedListeners [$ this -> id ] as $ wrapped ) {
143
+ foreach ($ this ->wrappedListeners [$ eventId ] as $ wrapped ) {
148
144
$ this ->dispatcher ->removeListener ($ eventName , $ wrapped );
149
- $ this ->dispatcher ->addListener ($ eventName , $ this ->wrappedListeners [$ this -> id ][$ wrapped ]);
145
+ $ this ->dispatcher ->addListener ($ eventName , $ this ->wrappedListeners [$ eventId ][$ wrapped ]);
150
146
}
151
147
152
- unset($ this ->wrappedListeners [$ this -> id ]);
148
+ unset($ this ->wrappedListeners [$ eventId ]);
153
149
154
150
return $ event ;
155
151
}
@@ -171,7 +167,7 @@ public function getNotCalledListeners()
171
167
172
168
foreach ($ this ->getListeners () as $ name => $ listeners ) {
173
169
foreach ($ listeners as $ listener ) {
174
- $ info = $ this ->getListenerInfo ($ listener , $ name );
170
+ $ info = $ this ->getListenerInfo ($ listener , $ name, null );
175
171
if (!isset ($ this ->called [$ name .'. ' .$ info ['pretty ' ]])) {
176
172
$ notCalled [$ name .'. ' .$ info ['pretty ' ]] = $ info ;
177
173
}
@@ -201,24 +197,24 @@ public function __call($method, $arguments)
201
197
* Whenever Symfony will require PHP 5.4, this could be changed
202
198
* to a proper private method.
203
199
*/
204
- public function logSkippedListeners ($ eventName , Event $ event , $ listener )
200
+ public function logSkippedListeners ($ eventName , $ eventId , Event $ event , $ listener )
205
201
{
206
202
if (null === $ this ->logger ) {
207
203
return ;
208
204
}
209
205
210
- $ info = $ this ->getListenerInfo ($ listener , $ eventName );
206
+ $ info = $ this ->getListenerInfo ($ listener , $ eventName, $ eventId );
211
207
212
208
$ this ->logger ->debug (sprintf ('Listener "%s" stopped propagation of the event "%s". ' , $ info ['pretty ' ], $ eventName ));
213
209
214
210
$ skippedListeners = $ this ->getListeners ($ eventName );
215
211
$ skipped = false ;
216
212
217
213
foreach ($ skippedListeners as $ skippedListener ) {
218
- $ skippedListener = $ this ->unwrapListener ($ skippedListener );
214
+ $ skippedListener = $ this ->unwrapListener ($ skippedListener, $ eventId );
219
215
220
216
if ($ skipped ) {
221
- $ info = $ this ->getListenerInfo ($ skippedListener , $ eventName );
217
+ $ info = $ this ->getListenerInfo ($ skippedListener , $ eventName, $ eventId );
222
218
$ this ->logger ->debug (sprintf ('Listener "%s" was not called for event "%s". ' , $ info ['pretty ' ], $ eventName ));
223
219
}
224
220
@@ -235,7 +231,7 @@ public function logSkippedListeners($eventName, Event $event, $listener)
235
231
* Whenever Symfony will require PHP 5.4, this could be changed
236
232
* to a proper private method.
237
233
*/
238
- public function preListenerCall ($ eventName , $ listener )
234
+ public function preListenerCall ($ eventName , $ eventId , $ listener )
239
235
{
240
236
// is it the first called listener?
241
237
if (isset ($ this ->firstCalledEvent [$ eventName ])) {
@@ -244,7 +240,7 @@ public function preListenerCall($eventName, $listener)
244
240
unset($ this ->firstCalledEvent [$ eventName ]);
245
241
}
246
242
247
- $ info = $ this ->getListenerInfo ($ listener , $ eventName );
243
+ $ info = $ this ->getListenerInfo ($ listener , $ eventName, $ eventId );
248
244
249
245
if (null !== $ this ->logger ) {
250
246
$ this ->logger ->debug (sprintf ('Notified event "%s" to listener "%s". ' , $ eventName , $ info ['pretty ' ]));
@@ -263,9 +259,9 @@ public function preListenerCall($eventName, $listener)
263
259
*
264
260
* @return array Information about the listener
265
261
*/
266
- private function getListenerInfo ($ listener , $ eventName )
262
+ private function getListenerInfo ($ listener , $ eventName, $ eventId )
267
263
{
268
- $ listener = $ this ->unwrapListener ($ listener );
264
+ $ listener = $ this ->unwrapListener ($ listener, $ eventId );
269
265
270
266
$ info = array (
271
267
'event ' => $ eventName ,
@@ -337,12 +333,12 @@ protected function postDispatch($eventName, Event $event)
337
333
{
338
334
}
339
335
340
- private function wrapListener ($ eventName , $ listener )
336
+ private function wrapListener ($ eventName , $ eventId , $ listener )
341
337
{
342
338
$ self = $ this ;
343
339
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 );
346
342
347
343
call_user_func ($ listener , $ event , $ eventName , $ self );
348
344
@@ -351,16 +347,24 @@ private function wrapListener($eventName, $listener)
351
347
}
352
348
353
349
if ($ event ->isPropagationStopped ()) {
354
- $ self ->logSkippedListeners ($ eventName , $ event , $ listener );
350
+ $ self ->logSkippedListeners ($ eventName , $ eventId , $ event , $ listener );
355
351
}
356
352
};
357
353
}
358
354
359
- private function unwrapListener ($ listener )
355
+ private function unwrapListener ($ listener, $ eventId )
360
356
{
361
357
// 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
+ }
364
368
}
365
369
366
370
return $ listener ;
0 commit comments