Test Setup Failed
Branch master (6c0567)
by Dawid
01:41
created

LazyEventSubscriberServiceProvider   A

Complexity

Total Complexity 5

Size/Duplication

Total Lines 75
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 3

Test Coverage

Coverage 85.71%

Importance

Changes 0
Metric Value
wmc 5
lcom 1
cbo 3
dl 0
loc 75
ccs 18
cts 21
cp 0.8571
rs 10
c 0
b 0
f 0

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 9 1
A register() 0 18 2
A getEventDispatcher() 0 13 2
1
<?php
2
3
namespace Spiechu\LazyPimple\DependencyInjection;
4
5
use Pimple\Container;
6
use Pimple\ServiceProviderInterface;
7
use Spiechu\LazyPimple\Factory\LazyServiceFactory;
8
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
9
10
class LazyEventSubscriberServiceProvider implements ServiceProviderInterface
11
{
12
    /**
13
     * @var LazyServiceFactory
14
     */
15
    protected $lazyServiceFactory;
16
17
    /**
18
     * @var string
19
     */
20
    protected $eventDispatcherServiceName;
21
22
    /**
23
     * @var string[]
24
     */
25
    protected $eventSubscriberServiceNames;
26
27
    /**
28
     * @param LazyServiceFactory $lazyServiceFactory
29
     * @param string             $eventDispatcherServiceName
30
     * @param string[]           $eventSubscriberServiceNames
31
     */
32 3
    public function __construct(
33
        LazyServiceFactory $lazyServiceFactory,
34
        string $eventDispatcherServiceName,
35
        array $eventSubscriberServiceNames
36
    ) {
37 3
        $this->lazyServiceFactory = $lazyServiceFactory;
38 3
        $this->eventDispatcherServiceName = $eventDispatcherServiceName;
39 3
        $this->eventSubscriberServiceNames = $eventSubscriberServiceNames;
40 3
    }
41
42
    /**
43
     * {@inheritdoc}
44
     */
45 3
    public function register(Container $container)
46
    {
47 3
        $eventDispatcher = $this->getEventDispatcher($container);
48
49 3
        foreach ($this->eventSubscriberServiceNames as $serviceName => $className) {
50
            // remember, here we have lazy subscribers
51
            // no subscriber instantiation until listened event is being dispatched
52 3
            $lazySubscriber = $this->lazyServiceFactory->getLazyServiceDefinition(
53 3
                $className,
54
                // encapsulate the whole Pimple service definition
55
                function () use ($container, $serviceName) {
56 1
                    return call_user_func($container->raw($serviceName), $container);
57 3
                }
58
            );
59
60 3
            $eventDispatcher->addSubscriber($lazySubscriber);
0 ignored issues
show
Documentation introduced by
$lazySubscriber is of type object<ProxyManager\Proxy\VirtualProxyInterface>, but the function expects a object<Symfony\Component...entSubscriberInterface>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
61
        }
62 3
    }
63
64
    /**
65
     * @param Container $container
66
     *
67
     * @throws \InvalidArgumentException When container cannot instantiate EventDispatcher object
68
     *
69
     * @return EventDispatcherInterface
70
     */
71 3
    protected function getEventDispatcher(Container $container): EventDispatcherInterface
72
    {
73 3
        $eventDispatcher = $container[$this->eventDispatcherServiceName];
74
75 3
        if (!$eventDispatcher instanceof EventDispatcherInterface) {
76
            throw new \InvalidArgumentException(sprintf(
77
                'Container service "%s" is not instance of "EventDispatcherInterface"',
78
                $this->eventDispatcherServiceName
79
            ));
80
        }
81
82 3
        return $eventDispatcher;
83
    }
84
}
85