Completed
Push — master ( d5ca7c...b8df74 )
by Dawid
02:46
created

getEventDispatcher()   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 14

Duplication

Lines 7
Ratio 50 %

Code Coverage

Tests 4
CRAP Score 4.125

Importance

Changes 0
Metric Value
dl 7
loc 14
ccs 4
cts 8
cp 0.5
rs 9.7998
c 0
b 0
f 0
cc 3
nc 2
nop 1
crap 4.125
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): void
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
                static 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 View Code Duplication
        if (!$eventDispatcher instanceof EventDispatcherInterface) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
76
            throw new \InvalidArgumentException(sprintf(
77
                'Container service "%s" is "%s" and not exptected instance of "EventDispatcherInterface"',
78
                $this->eventDispatcherServiceName,
79
                \is_object($eventDispatcher) ? \get_class($eventDispatcher) : \gettype($eventDispatcher)
80
            ));
81
        }
82
83 3
        return $eventDispatcher;
84
    }
85
}
86