vendor/symfony/event-dispatcher/Debug/WrappedListener.php line 102

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the Symfony package.
  4.  *
  5.  * (c) Fabien Potencier <fabien@symfony.com>
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. namespace Symfony\Component\EventDispatcher\Debug;
  11. use Psr\EventDispatcher\StoppableEventInterface;
  12. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  13. use Symfony\Component\Stopwatch\Stopwatch;
  14. use Symfony\Component\VarDumper\Caster\ClassStub;
  15. /**
  16.  * @author Fabien Potencier <fabien@symfony.com>
  17.  */
  18. final class WrappedListener
  19. {
  20.     private string|array|object $listener;
  21.     private ?\Closure $optimizedListener;
  22.     private string $name;
  23.     private bool $called false;
  24.     private bool $stoppedPropagation false;
  25.     private $stopwatch;
  26.     private $dispatcher;
  27.     private string $pretty;
  28.     private $stub;
  29.     private ?int $priority null;
  30.     private static bool $hasClassStub;
  31.     public function __construct(callable|array $listener, ?string $nameStopwatch $stopwatchEventDispatcherInterface $dispatcher null)
  32.     {
  33.         $this->listener $listener;
  34.         $this->optimizedListener $listener instanceof \Closure $listener : (\is_callable($listener) ? \Closure::fromCallable($listener) : null);
  35.         $this->stopwatch $stopwatch;
  36.         $this->dispatcher $dispatcher;
  37.         if (\is_array($listener)) {
  38.             $this->name \is_object($listener[0]) ? get_debug_type($listener[0]) : $listener[0];
  39.             $this->pretty $this->name.'::'.$listener[1];
  40.         } elseif ($listener instanceof \Closure) {
  41.             $r = new \ReflectionFunction($listener);
  42.             if (str_contains($r->name'{closure}')) {
  43.                 $this->pretty $this->name 'closure';
  44.             } elseif ($class \PHP_VERSION_ID >= 80111 $r->getClosureCalledClass() : $r->getClosureScopeClass()) {
  45.                 $this->name $class->name;
  46.                 $this->pretty $this->name.'::'.$r->name;
  47.             } else {
  48.                 $this->pretty $this->name $r->name;
  49.             }
  50.         } elseif (\is_string($listener)) {
  51.             $this->pretty $this->name $listener;
  52.         } else {
  53.             $this->name get_debug_type($listener);
  54.             $this->pretty $this->name.'::__invoke';
  55.         }
  56.         if (null !== $name) {
  57.             $this->name $name;
  58.         }
  59.         self::$hasClassStub ??= class_exists(ClassStub::class);
  60.     }
  61.     public function getWrappedListener(): callable|array
  62.     {
  63.         return $this->listener;
  64.     }
  65.     public function wasCalled(): bool
  66.     {
  67.         return $this->called;
  68.     }
  69.     public function stoppedPropagation(): bool
  70.     {
  71.         return $this->stoppedPropagation;
  72.     }
  73.     public function getPretty(): string
  74.     {
  75.         return $this->pretty;
  76.     }
  77.     public function getInfo(string $eventName): array
  78.     {
  79.         $this->stub ??= self::$hasClassStub ? new ClassStub($this->pretty.'()'$this->listener) : $this->pretty.'()';
  80.         return [
  81.             'event' => $eventName,
  82.             'priority' => null !== $this->priority $this->priority : (null !== $this->dispatcher $this->dispatcher->getListenerPriority($eventName$this->listener) : null),
  83.             'pretty' => $this->pretty,
  84.             'stub' => $this->stub,
  85.         ];
  86.     }
  87.     public function __invoke(object $eventstring $eventNameEventDispatcherInterface $dispatcher): void
  88.     {
  89.         $dispatcher $this->dispatcher ?: $dispatcher;
  90.         $this->called true;
  91.         $this->priority $dispatcher->getListenerPriority($eventName$this->listener);
  92.         $e $this->stopwatch->start($this->name'event_listener');
  93.         ($this->optimizedListener ?? $this->listener)($event$eventName$dispatcher);
  94.         if ($e->isStarted()) {
  95.             $e->stop();
  96.         }
  97.         if ($event instanceof StoppableEventInterface && $event->isPropagationStopped()) {
  98.             $this->stoppedPropagation true;
  99.         }
  100.     }
  101. }