15
15
use Symfony \Component \EventDispatcher \EventSubscriberInterface ;
16
16
use Symfony \Component \EventDispatcher \Event ;
17
17
use Symfony \Component \Stopwatch \Stopwatch ;
18
- use Symfony \Component \VarDumper \Caster \ClassStub ;
19
- use Symfony \Component \VarDumper \Cloner \VarCloner ;
20
18
use Psr \Log \LoggerInterface ;
21
19
22
20
/**
@@ -34,7 +32,6 @@ class TraceableEventDispatcher implements TraceableEventDispatcherInterface
34
32
private $ called ;
35
33
private $ dispatcher ;
36
34
private $ wrappedListeners ;
37
- private $ cloner ;
38
35
39
36
/**
40
37
* Constructor.
@@ -50,9 +47,6 @@ public function __construct(EventDispatcherInterface $dispatcher, Stopwatch $sto
50
47
$ this ->logger = $ logger ;
51
48
$ this ->called = array ();
52
49
$ this ->wrappedListeners = array ();
53
- if (class_exists (ClassStub::class)) {
54
- $ this ->cloner = new VarCloner ();
55
- }
56
50
}
57
51
58
52
/**
@@ -159,8 +153,7 @@ public function getCalledListeners()
159
153
$ called = array ();
160
154
foreach ($ this ->called as $ eventName => $ listeners ) {
161
155
foreach ($ listeners as $ listener ) {
162
- $ info = $ this ->getListenerInfo ($ listener ->getWrappedListener (), $ eventName );
163
- $ called [$ eventName .'. ' .$ info ['pretty ' ]] = $ info ;
156
+ $ called [$ eventName .'. ' .$ listener ->getPretty ()] = $ listener ->getInfo ($ eventName );
164
157
}
165
158
}
166
159
@@ -198,8 +191,10 @@ public function getNotCalledListeners()
198
191
}
199
192
200
193
if (!$ called ) {
201
- $ info = $ this ->getListenerInfo ($ listener , $ eventName );
202
- $ notCalled [$ eventName .'. ' .$ info ['pretty ' ]] = $ info ;
194
+ if (!$ listener instanceof WrappedListener) {
195
+ $ listener = new WrappedListener ($ listener , null , $ this ->stopwatch , $ this );
196
+ }
197
+ $ notCalled [$ eventName .'. ' .$ listener ->getPretty ()] = $ listener ->getInfo ($ eventName );
203
198
}
204
199
}
205
200
}
@@ -245,12 +240,11 @@ protected function postDispatch($eventName, Event $event)
245
240
private function preProcess ($ eventName )
246
241
{
247
242
foreach ($ this ->dispatcher ->getListeners ($ eventName ) as $ listener ) {
248
- $ info = $ this ->getListenerInfo ($ listener , $ eventName );
249
- $ name = isset ($ info ['class ' ]) ? $ info ['class ' ] : $ info ['type ' ];
250
- $ wrappedListener = new WrappedListener ($ listener , $ name , $ this ->stopwatch , $ this );
243
+ $ priority = $ this ->getListenerPriority ($ eventName , $ listener );
244
+ $ wrappedListener = new WrappedListener ($ listener , null , $ this ->stopwatch , $ this );
251
245
$ this ->wrappedListeners [$ eventName ][] = $ wrappedListener ;
252
246
$ this ->dispatcher ->removeListener ($ eventName , $ listener );
253
- $ this ->dispatcher ->addListener ($ eventName , $ wrappedListener , $ info [ ' priority ' ] );
247
+ $ this ->dispatcher ->addListener ($ eventName , $ wrappedListener , $ priority );
254
248
}
255
249
}
256
250
@@ -267,10 +261,13 @@ private function postProcess($eventName)
267
261
$ this ->dispatcher ->removeListener ($ eventName , $ listener );
268
262
$ this ->dispatcher ->addListener ($ eventName , $ listener ->getWrappedListener (), $ priority );
269
263
270
- $ info = $ this ->getListenerInfo ($ listener ->getWrappedListener (), $ eventName );
264
+ if (null !== $ this ->logger ) {
265
+ $ context = array ('event ' => $ eventName , 'listener ' => $ listener ->getPretty ());
266
+ }
267
+
271
268
if ($ listener ->wasCalled ()) {
272
269
if (null !== $ this ->logger ) {
273
- $ this ->logger ->debug ('Notified event "{event}" to listener "{listener}". ' , array ( ' event ' => $ eventName , ' listener ' => $ info [ ' pretty ' ]) );
270
+ $ this ->logger ->debug ('Notified event "{event}" to listener "{listener}". ' , $ context );
274
271
}
275
272
276
273
if (!isset ($ this ->called [$ eventName ])) {
@@ -281,83 +278,19 @@ private function postProcess($eventName)
281
278
}
282
279
283
280
if (null !== $ this ->logger && $ skipped ) {
284
- $ this ->logger ->debug ('Listener "{listener}" was not called for event "{event}". ' , array ( ' listener ' => $ info [ ' pretty ' ], ' event ' => $ eventName ) );
281
+ $ this ->logger ->debug ('Listener "{listener}" was not called for event "{event}". ' , $ context );
285
282
}
286
283
287
284
if ($ listener ->stoppedPropagation ()) {
288
285
if (null !== $ this ->logger ) {
289
- $ this ->logger ->debug ('Listener "{listener}" stopped propagation of the event "{event}". ' , array ( ' listener ' => $ info [ ' pretty ' ], ' event ' => $ eventName ) );
286
+ $ this ->logger ->debug ('Listener "{listener}" stopped propagation of the event "{event}". ' , $ context );
290
287
}
291
288
292
289
$ skipped = true ;
293
290
}
294
291
}
295
292
}
296
293
297
- /**
298
- * Returns information about the listener.
299
- *
300
- * @param object $listener The listener
301
- * @param string $eventName The event name
302
- *
303
- * @return array Information about the listener
304
- */
305
- private function getListenerInfo ($ listener , $ eventName )
306
- {
307
- $ info = array (
308
- 'event ' => $ eventName ,
309
- 'priority ' => $ this ->getListenerPriority ($ eventName , $ listener ),
310
- );
311
- if ($ listener instanceof \Closure) {
312
- $ info += array (
313
- 'type ' => 'Closure ' ,
314
- 'pretty ' => 'closure ' ,
315
- );
316
- } elseif (is_string ($ listener )) {
317
- try {
318
- $ r = new \ReflectionFunction ($ listener );
319
- $ file = $ r ->getFileName ();
320
- $ line = $ r ->getStartLine ();
321
- } catch (\ReflectionException $ e ) {
322
- $ file = null ;
323
- $ line = null ;
324
- }
325
- $ info += array (
326
- 'type ' => 'Function ' ,
327
- 'function ' => $ listener ,
328
- 'file ' => $ file ,
329
- 'line ' => $ line ,
330
- 'pretty ' => $ listener ,
331
- );
332
- } elseif (is_array ($ listener ) || (is_object ($ listener ) && is_callable ($ listener ))) {
333
- if (!is_array ($ listener )) {
334
- $ listener = array ($ listener , '__invoke ' );
335
- }
336
- $ class = is_object ($ listener [0 ]) ? get_class ($ listener [0 ]) : $ listener [0 ];
337
- try {
338
- $ r = new \ReflectionMethod ($ class , $ listener [1 ]);
339
- $ file = $ r ->getFileName ();
340
- $ line = $ r ->getStartLine ();
341
- } catch (\ReflectionException $ e ) {
342
- $ file = null ;
343
- $ line = null ;
344
- }
345
- $ info += array (
346
- 'type ' => 'Method ' ,
347
- 'class ' => $ class ,
348
- 'method ' => $ listener [1 ],
349
- 'file ' => $ file ,
350
- 'line ' => $ line ,
351
- 'pretty ' => $ class .':: ' .$ listener [1 ],
352
- );
353
- }
354
- if (null !== $ this ->cloner ) {
355
- $ info ['data ' ] = $ this ->cloner ->cloneVar (array (new ClassStub ($ info ['pretty ' ].'() ' , $ listener )))->seek (0 );
356
- }
357
-
358
- return $ info ;
359
- }
360
-
361
294
private function sortListenersByPriority ($ a , $ b )
362
295
{
363
296
if (is_int ($ a ['priority ' ]) && !is_int ($ b ['priority ' ])) {
0 commit comments