ServicesBuilder   A
last analyzed

Complexity

Total Complexity 9

Size/Duplication

Total Lines 78
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 6

Test Coverage

Coverage 88%

Importance

Changes 5
Bugs 2 Features 2
Metric Value
wmc 9
c 5
b 2
f 2
lcom 1
cbo 6
dl 0
loc 78
rs 10
ccs 22
cts 25
cp 0.88

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 11 2
B build() 0 19 5
A getParameterResolver() 0 9 2
1
<?php
2
3
/*
4
 * This file is part of the LaravelYaml package.
5
 *
6
 * (c) Théo FIDRY <[email protected]>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace Fidry\LaravelYaml\DependencyInjection\Builder;
13
14
use Fidry\LaravelYaml\DependencyInjection\Builder\Instantiator\ServiceInstantiator;
15
use Fidry\LaravelYaml\DependencyInjection\Definition\ServiceInterface;
16
use Fidry\LaravelYaml\DependencyInjection\Resolver\BaseReferenceResolver;
17
use Fidry\LaravelYaml\DependencyInjection\Resolver\BuiltParameterResolver;
18
use Fidry\LaravelYaml\DependencyInjection\Resolver\ParameterResolverInterface;
19
use Fidry\LaravelYaml\DependencyInjection\Resolver\ReferenceResolverInterface;
20
use Fidry\LaravelYaml\Exception\DependencyInjection\Exception;
21
use Fidry\LaravelYaml\Exception\DependencyInjection\Resolver\Exception as ResolverException;
22
use Illuminate\Contracts\Config\Repository as ConfigRepository;
23
use Illuminate\Contracts\Container\BindingResolutionException;
24
use Illuminate\Contracts\Foundation\Application;
25
26
/**
27
 * @author Théo FIDRY <[email protected]>
28
 */
29
final class ServicesBuilder implements BuilderInterface
30
{
31
    /**
32
     * @var array
33
     */
34
    private $parameters;
35
36
    /**
37
     * @var ReferenceResolverInterface
38
     */
39
    private $referenceResolver;
40
41
    /**
42
     * @var ServiceInterface[]
43
     */
44
    private $services;
45
46
    /**
47
     * @var ParameterResolverInterface|null
48
     */
49
    private $parameterResolver;
50
51
    /**
52
     * @param ServiceInterface[]              $services
53
     * @param array                           $parameters
54
     * @param ParameterResolverInterface|null $parameterResolver
55
     * @param ReferenceResolverInterface|null $referenceResolver
56
     */
57 16
    public function __construct(
58
        array $services,
59
        array $parameters,
60
        ParameterResolverInterface $parameterResolver = null,
61
        ReferenceResolverInterface $referenceResolver = null
62
    ) {
63 16
        $this->services = $services;
64 16
        $this->parameters = $parameters;
65 16
        $this->parameterResolver = $parameterResolver;
66 16
        $this->referenceResolver = (null === $referenceResolver) ? new BaseReferenceResolver() : $referenceResolver;
67 16
    }
68
69
    /**
70
     * {@inheritdoc}
71
     */
72 16
    public function build(Application $application)
73
    {
74
        try {
75 16
            $parameterResolver = $this->getParameterResolver($application);
76 16
            $instantiator = new ServiceInstantiator($parameterResolver, $this->referenceResolver, $application);
77 16
            $serviceBuilder = new ServiceBuilder($instantiator);
78 16
            foreach ($this->services as $service) {
79 14
                $serviceBuilder->build($service, $application);
80 5
            }
81
82 10
            return $this->parameters;
83 6
        } catch (BindingResolutionException $exception) {
84 2
            throw new Exception(sprintf('Could not load "%s" class', ConfigRepository::class), 0, $exception);
85 4
        } catch (ResolverException $exception) {
86
            throw new Exception('Could not resolve the parameters', 0, $exception);
87 4
        } catch (\Exception $exception) {
88 4
            throw new Exception('Could not build the parameters', 0, $exception);
89
        }
90
    }
91
92
    /**
93
     * @param Application $application
94
     *
95
     * @return ParameterResolverInterface
96
     */
97 16
    private function getParameterResolver(Application $application)
98
    {
99 16
        if (null !== $this->parameterResolver) {
100 16
            return $this->parameterResolver;
101
        }
102
        $config = $application->make(ConfigRepository::class);
103
104
        return new BuiltParameterResolver($this->parameters, $config);
105
    }
106
}
107