This repository has been archived by the owner on Jan 29, 2020. It is now read-only.
/
Factory.php
306 lines (268 loc) · 9.13 KB
/
Factory.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
<?php
/**
* @see https://github.com/zendframework/zend-config for the canonical source repository
* @copyright Copyright (c) 2005-2017 Zend Technologies USA Inc. (http://www.zend.com)
* @license https://github.com/zendframework/zend-config/blob/master/LICENSE.md New BSD License
*/
namespace Zend\Config;
use Psr\Container\ContainerInterface;
use Zend\Stdlib\ArrayUtils;
class Factory
{
/**
* Plugin manager for loading readers
*
* @var null|ContainerInterface
*/
public static $readers = null;
/**
* Plugin manager for loading writers
*
* @var null|ContainerInterface
*/
public static $writers = null;
/**
* Registered config file extensions.
* key is extension, value is reader instance or plugin name
*
* @var array
*/
protected static $extensions = [
'ini' => 'ini',
'json' => 'json',
'xml' => 'xml',
'yaml' => 'yaml',
'yml' => 'yaml',
'properties' => 'javaproperties',
];
/**
* Register config file extensions for writing
* key is extension, value is writer instance or plugin name
*
* @var array
*/
protected static $writerExtensions = [
'php' => 'php',
'ini' => 'ini',
'json' => 'json',
'xml' => 'xml',
'yaml' => 'yaml',
'yml' => 'yaml',
];
/**
* Read a config from a file.
*
* @param string $filename
* @param bool $returnConfigObject
* @param bool $useIncludePath
* @return array|Config
* @throws Exception\InvalidArgumentException
* @throws Exception\RuntimeException
*/
public static function fromFile($filename, $returnConfigObject = false, $useIncludePath = false)
{
$filepath = $filename;
if (! file_exists($filename)) {
if (! $useIncludePath) {
throw new Exception\RuntimeException(sprintf(
'Filename "%s" cannot be found relative to the working directory',
$filename
));
}
$fromIncludePath = stream_resolve_include_path($filename);
if (! $fromIncludePath) {
throw new Exception\RuntimeException(sprintf(
'Filename "%s" cannot be found relative to the working directory or the include_path ("%s")',
$filename,
get_include_path()
));
}
$filepath = $fromIncludePath;
}
$pathinfo = pathinfo($filepath);
if (! isset($pathinfo['extension'])) {
throw new Exception\RuntimeException(sprintf(
'Filename "%s" is missing an extension and cannot be auto-detected',
$filename
));
}
$extension = strtolower($pathinfo['extension']);
if ($extension === 'php') {
if (! is_file($filepath) || ! is_readable($filepath)) {
throw new Exception\RuntimeException(sprintf(
"File '%s' doesn't exist or not readable",
$filename
));
}
$config = include $filepath;
} elseif (isset(static::$extensions[$extension])) {
$reader = static::$extensions[$extension];
if (! $reader instanceof Reader\ReaderInterface) {
$reader = static::getReaderPluginManager()->get($reader);
static::$extensions[$extension] = $reader;
}
/* @var Reader\ReaderInterface $reader */
$config = $reader->fromFile($filepath);
} else {
throw new Exception\RuntimeException(sprintf(
'Unsupported config file extension: .%s',
$pathinfo['extension']
));
}
return ($returnConfigObject) ? new Config($config) : $config;
}
/**
* Read configuration from multiple files and merge them.
*
* @param array $files
* @param bool $returnConfigObject
* @param bool $useIncludePath
* @return array|Config
*/
public static function fromFiles(array $files, $returnConfigObject = false, $useIncludePath = false)
{
$config = [];
foreach ($files as $file) {
$config = ArrayUtils::merge($config, static::fromFile($file, false, $useIncludePath));
}
return ($returnConfigObject) ? new Config($config) : $config;
}
/**
* Writes a config to a file
*
* @param string $filename
* @param array|Config $config
* @return bool TRUE on success | FALSE on failure
* @throws Exception\RuntimeException
* @throws Exception\InvalidArgumentException
*/
public static function toFile($filename, $config)
{
if ((is_object($config) && ! ($config instanceof Config))
|| (! is_object($config) && ! is_array($config))
) {
throw new Exception\InvalidArgumentException(
__METHOD__." \$config should be an array or instance of Zend\\Config\\Config"
);
}
$extension = substr(strrchr($filename, '.'), 1);
$directory = dirname($filename);
if (! is_dir($directory)) {
throw new Exception\RuntimeException(
"Directory '{$directory}' does not exists!"
);
}
if (! is_writable($directory)) {
throw new Exception\RuntimeException(
"Cannot write in directory '{$directory}'"
);
}
if (! isset(static::$writerExtensions[$extension])) {
throw new Exception\RuntimeException(
"Unsupported config file extension: '.{$extension}' for writing."
);
}
$writer = static::$writerExtensions[$extension];
if (($writer instanceof Writer\AbstractWriter) === false) {
$writer = self::getWriterPluginManager()->get($writer);
static::$writerExtensions[$extension] = $writer;
}
if (is_object($config)) {
$config = $config->toArray();
}
$content = $writer->processConfig($config);
return (bool) (file_put_contents($filename, $content) !== false);
}
/**
* Set reader plugin manager
*
* @param ContainerInterface $readers
* @return void
*/
public static function setReaderPluginManager(ContainerInterface $readers)
{
static::$readers = $readers;
}
/**
* Get the reader plugin manager.
*
* If none is available, registers and returns a
* StandaloneReaderPluginManager instance by default.
*
* @return ContainerInterface
*/
public static function getReaderPluginManager()
{
if (static::$readers === null) {
static::$readers = new StandaloneReaderPluginManager();
}
return static::$readers;
}
/**
* Set writer plugin manager
*
* @param ContainerInterface $writers
* @return void
*/
public static function setWriterPluginManager(ContainerInterface $writers)
{
static::$writers = $writers;
}
/**
* Get the writer plugin manager.
*
* If none is available, registers and returns a
* StandaloneWriterPluginManager instance by default.
*
* @return ContainerInterface
*/
public static function getWriterPluginManager()
{
if (static::$writers === null) {
static::$writers = new StandaloneWriterPluginManager();
}
return static::$writers;
}
/**
* Set config reader for file extension
*
* @param string $extension
* @param string|Reader\ReaderInterface $reader
* @throws Exception\InvalidArgumentException
* @return void
*/
public static function registerReader($extension, $reader)
{
$extension = strtolower($extension);
if (! is_string($reader) && ! $reader instanceof Reader\ReaderInterface) {
throw new Exception\InvalidArgumentException(sprintf(
'Reader should be plugin name, class name or ' .
'instance of %s\Reader\ReaderInterface; received "%s"',
__NAMESPACE__,
(is_object($reader) ? get_class($reader) : gettype($reader))
));
}
static::$extensions[$extension] = $reader;
}
/**
* Set config writer for file extension
*
* @param string $extension
* @param string|Writer\AbstractWriter $writer
* @throws Exception\InvalidArgumentException
* @return void
*/
public static function registerWriter($extension, $writer)
{
$extension = strtolower($extension);
if (! is_string($writer) && ! $writer instanceof Writer\AbstractWriter) {
throw new Exception\InvalidArgumentException(sprintf(
'Writer should be plugin name, class name or ' .
'instance of %s\Writer\AbstractWriter; received "%s"',
__NAMESPACE__,
(is_object($writer) ? get_class($writer) : gettype($writer))
));
}
static::$writerExtensions[$extension] = $writer;
}
}