Completed
Pull Request — master (#37)
by Tom
02:20
created

Configurator::apply()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

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