Completed
Pull Request — master (#52)
by Tom
04:13
created

Configurator::apply()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 0
1
<?php
2
3
namespace TomPHP\ContainerConfigurator;
4
5
use TomPHP\ContainerConfigurator\Exception\NoMatchingFilesException;
6
use TomPHP\ContainerConfigurator\Exception\UnknownSettingException;
7
use Assert\Assertion;
8
9
final class Configurator
10
{
11
    const FILE_READERS = [
12
        '.json' => FileReader\JSONFileReader::class,
13
        '.php'  => FileReader\PHPFileReader::class,
14
    ];
15
16
    const CONTAINER_ADAPTERS = [
17
        \League\Container\Container::class => League\LeagueContainerAdapter::class,
18
        \Pimple\Container::class           => Pimple\PimpleContainerAdapter::class,
19
    ];
20
21
    /**
22
     * @var ApplicationConfig
23
     */
24
    private $config;
25
26
    /**
27
     * @var array
28
     */
29
    private $settings = [
30
        'config_prefix'      => 'config',
31
        'config_separator'   => '.',
32
        'services_key'       => 'di.services',
33
        'inflectors_key'     => 'di.inflectors',
34
        'singleton_services' => false,
35
    ];
36
37
    /**
38
     * @api
39
     *
40
     * @return Configurator
41
     */
42
    public static function apply()
43
    {
44
        return new self();
45
    }
46
47
    private function __construct()
48
    {
49
        $this->config = new ApplicationConfig([]);
50
    }
51
52
    /**
53
     * @api
54
     *
55
     * @param array $config
56
     *
57
     * @return Configurator
58
     */
59
    public function configFromArray(array $config)
60
    {
61
        $this->config->merge($config);
62
63
        return $this;
64
    }
65
66
    /**
67
     * @api
68
     *
69
     * @param string $pattern
70
     *
71
     * @return Configurator
72
     */
73
    public function configFromFiles($pattern)
74
    {
75
        Assertion::string($pattern);
76
77
        $locator = new FileReader\FileLocator();
78
79
        $files = $locator->locate($pattern);
80
81
        if (count($files) === 0) {
82
            throw NoMatchingFilesException::fromPattern($pattern);
83
        }
84
85
        $factory = new FileReader\ReaderFactory(self::FILE_READERS);
86
87
        foreach ($files as $filename) {
88
            $reader = $factory->create($filename);
89
            $this->config->merge($reader->read($filename));
90
        }
91
92
        return $this;
93
    }
94
95
    /**
96
     * @api
97
     *
98
     * @param string $name
99
     * @param mixed  $value
100
     *
101
     * @return Configurator
102
     */
103
    public function withSetting($name, $value)
104
    {
105
        Assertion::string($name);
106
        Assertion::scalar($value);
107
108
        if (!array_key_exists($name, $this->settings)) {
109
            throw UnknownSettingException::fromSetting($name, array_keys($this->settings));
110
        }
111
112
        $this->settings[$name] = $value;
113
114
        return $this;
115
    }
116
117
    /**
118
     * @api
119
     *
120
     * @param object $container
121
     *
122
     * @return void
123
     */
124
    public function to($container)
125
    {
126
        $this->config->setSeparator($this->settings['config_separator']);
127
128
        $factory = new ContainerAdapterFactory(self::CONTAINER_ADAPTERS);
129
130
        $configurator = $factory->create($container);
131
132
        $configurator->addApplicationConfig($this->config, $this->settings['config_prefix']);
133
134
        if (isset($this->config[$this->settings['services_key']])) {
135
            $configurator->addServiceConfig(new ServiceConfig(
136
                $this->config[$this->settings['services_key']],
137
                $this->settings['singleton_services']
138
            ));
139
        }
140
141
        if (isset($this->config[$this->settings['inflectors_key']])) {
142
            $configurator->addInflectorConfig(new InflectorConfig($this->config[$this->settings['inflectors_key']]));
143
        }
144
    }
145
}
146