Passed
Push — master ( 9fe00e...ce2820 )
by Koldo
10:56
created

src/Container/Config/MarshalDelegatorsConfig.php (1 issue)

Severity
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Antidot\Container\Config;
6
7
use Antidot\Container\ContainerDelegatorFactory;
8
use Aura\Di\Container;
9
10
use function is_callable;
11
12
/**
13
 * @deprecated will remove in version 1.0.0
14
 *
15
 * Class MarshalDelegatorsConfig
16
 * @package Antidot\Container\Config
17
 */
18
class MarshalDelegatorsConfig
19
{
20
    public function __invoke(Container $container, array $dependencies): array
21
    {
22
        foreach ($dependencies['delegators'] as $service => $delegatorNames) {
23
            $factory = null;
24
            $this->delegateServices($dependencies, $service, $factory);
25
            $this->delegateFactories($container, $dependencies, $service, $factory);
26
            $this->delegateInvokables($dependencies, $service, $factory);
27
            if (!is_callable($factory)) {
28
                continue;
29
            }
30
            $delegatorFactory = 'AuraDelegatorFactory::'.$service;
31
            $container->set($delegatorFactory, static function () use ($delegatorNames, $factory) {
32
                return new ContainerDelegatorFactory($delegatorNames, $factory);
0 ignored issues
show
Deprecated Code introduced by
The class Antidot\Container\ContainerDelegatorFactory has been deprecated: will remove in version 1.0.0 ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

32
                return /** @scrutinizer ignore-deprecated */ new ContainerDelegatorFactory($delegatorNames, $factory);
Loading history...
33
            });
34
            $container->set(
35
                $service,
36
                $container->lazyGetCall($delegatorFactory, 'build', $container, $service)
37
            );
38
            $container->types[$service] = $container->lazyGet($service);
39
        }
40
41
        return $dependencies;
42
    }
43
44
    private function delegateServices(array &$dependencies, string $service, ?callable &$factory): void
45
    {
46
        if (empty($dependencies['services'][$service])) {
47
            return;
48
        }
49
        // Marshal from service
50
        $instance = $dependencies['services'][$service];
51
        $factory = static function () use ($instance) {
52
            return $instance;
53
        };
54
        unset($dependencies['service'][$service]);
55
    }
56
57
    private function delegateFactories(
58
        Container $container,
59
        array &$dependencies,
60
        string $service,
61
        ?callable &$factory
62
    ): void {
63
        if (empty($dependencies['factories'][$service])) {
64
            return;
65
        }
66
        // Marshal from factory
67
        $serviceFactory = $dependencies['factories'][$service];
68
        $factory = static function () use ($service, $serviceFactory, $container) {
69
            $aService = new $serviceFactory();
70
71
            return is_callable($serviceFactory)
72
                ? $serviceFactory($container, $service)
73
                : $aService($container, $service);
74
        };
75
        unset($dependencies['factories'][$service]);
76
    }
77
78
    private function delegateInvokables(array &$dependencies, string $service, ?callable &$factory): void
79
    {
80
        if (empty($dependencies['invokables'][$service])) {
81
            return;
82
        }
83
        // Marshal from invokable
84
        $class = $dependencies['invokables'][$service];
85
        $factory = static function () use ($class) {
86
            return new $class();
87
        };
88
        unset($dependencies['invokables'][$service]);
89
    }
90
}
91