Вход Регистрация
Файл: vendor/symfony/event-dispatcher/Debug/WrappedListener.php
Строк: 160
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace SymfonyComponentEventDispatcherDebug;

use 
PsrEventDispatcherStoppableEventInterface;
use 
SymfonyComponentEventDispatcherEventDispatcherInterface;
use 
SymfonyComponentStopwatchStopwatch;
use 
SymfonyComponentVarDumperCasterClassStub;

/**
 * @author Fabien Potencier <fabien@symfony.com>
 */
final class WrappedListener
{
    private 
string|array|object $listener;
    private ?
Closure $optimizedListener;
    private 
string $name;
    private 
bool $called false;
    private 
bool $stoppedPropagation false;
    private 
$stopwatch;
    private 
$dispatcher;
    private 
string $pretty;
    private 
$stub;
    private ?
int $priority null;
    private static 
bool $hasClassStub;

    public function 
__construct(callable|array $listener, ?string $nameStopwatch $stopwatchEventDispatcherInterface $dispatcher null)
    {
        
$this->listener $listener;
        
$this->optimizedListener $listener instanceof Closure $listener : (is_callable($listener) ? Closure::fromCallable($listener) : null);
        
$this->stopwatch $stopwatch;
        
$this->dispatcher $dispatcher;

        if (
is_array($listener)) {
            
$this->name is_object($listener[0]) ? get_debug_type($listener[0]) : $listener[0];
            
$this->pretty $this->name.'::'.$listener[1];
        } elseif (
$listener instanceof Closure) {
            
$r = new ReflectionFunction($listener);
            if (
str_contains($r->name'{closure}')) {
                
$this->pretty $this->name 'closure';
            } elseif (
$class PHP_VERSION_ID >= 80111 $r->getClosureCalledClass() : $r->getClosureScopeClass()) {
                
$this->name $class->name;
                
$this->pretty $this->name.'::'.$r->name;
            } else {
                
$this->pretty $this->name $r->name;
            }
        } elseif (
is_string($listener)) {
            
$this->pretty $this->name $listener;
        } else {
            
$this->name get_debug_type($listener);
            
$this->pretty $this->name.'::__invoke';
        }

        if (
null !== $name) {
            
$this->name $name;
        }

        
self::$hasClassStub ??= class_exists(ClassStub::class);
    }

    public function 
getWrappedListener(): callable|array
    {
        return 
$this->listener;
    }

    public function 
wasCalled(): bool
    
{
        return 
$this->called;
    }

    public function 
stoppedPropagation(): bool
    
{
        return 
$this->stoppedPropagation;
    }

    public function 
getPretty(): string
    
{
        return 
$this->pretty;
    }

    public function 
getInfo(string $eventName): array
    {
        
$this->stub ??= self::$hasClassStub ? new ClassStub($this->pretty.'()'$this->listener) : $this->pretty.'()';

        return [
            
'event' => $eventName,
            
'priority' => null !== $this->priority $this->priority : (null !== $this->dispatcher $this->dispatcher->getListenerPriority($eventName$this->listener) : null),
            
'pretty' => $this->pretty,
            
'stub' => $this->stub,
        ];
    }

    public function 
__invoke(object $eventstring $eventNameEventDispatcherInterface $dispatcher): void
    
{
        
$dispatcher $this->dispatcher ?: $dispatcher;

        
$this->called true;
        
$this->priority $dispatcher->getListenerPriority($eventName$this->listener);

        
$e $this->stopwatch->start($this->name'event_listener');

        (
$this->optimizedListener ?? $this->listener)($event$eventName$dispatcher);

        if (
$e->isStarted()) {
            
$e->stop();
        }

        if (
$event instanceof StoppableEventInterface && $event->isPropagationStopped()) {
            
$this->stoppedPropagation true;
        }
    }
}
Онлайн: 1
Реклама