-
Notifications
You must be signed in to change notification settings - Fork 135
/
Config.php
157 lines (138 loc) · 4.44 KB
/
Config.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
<?php
namespace Noodlehaus;
use Noodlehaus\Exception\FileNotFoundException;
use Noodlehaus\Exception\UnsupportedFormatException;
use Noodlehaus\Exception\EmptyDirectoryException;
/**
* Config
*
* @package Config
* @author Jesus A. Domingo <jesus.domingo@gmail.com>
* @author Hassan Khan <contact@hassankhan.me>
* @link https://github.com/noodlehaus/config
* @license MIT
*/
class Config extends AbstractConfig
{
/**
* All file formats supported by Config
*
* @var array
*/
private $supportedFileParsers = array(
'Noodlehaus\FileParser\Php',
'Noodlehaus\FileParser\Ini',
'Noodlehaus\FileParser\Json',
'Noodlehaus\FileParser\Xml',
'Noodlehaus\FileParser\Yaml'
);
/**
* Static method for loading a Config instance.
*
* @param string|array $path
*
* @return Config
*/
public static function load($path)
{
return new static($path);
}
/**
* Loads a supported configuration file format.
*
* @param string|array $path
*
* @throws EmptyDirectoryException If `$path` is an empty directory
*/
public function __construct($path)
{
$paths = $this->getValidPath($path);
$this->data = array();
foreach ($paths as $path) {
// Get file information
$info = pathinfo($path);
$extension = isset($info['extension']) ? $info['extension'] : '';
$parser = $this->getParser($extension);
// Try and load file
$this->data = array_replace_recursive($this->data, $parser->parse($path));
}
parent::__construct($this->data);
}
/**
* Gets a parser for a given file extension
*
* @param string $extension
*
* @return Noodlehaus\File\FileInterface
*
* @throws UnsupportedFormatException If `$path` is an unsupported file format
*/
private function getParser($extension)
{
$parser = null;
foreach ($this->supportedFileParsers as $fileParser) {
$tempParser = new $fileParser;
if (in_array($extension, $tempParser->getSupportedExtensions($extension))) {
$parser = $tempParser;
continue;
}
}
// If none exist, then throw an exception
if ($parser === null) {
throw new UnsupportedFormatException('Unsupported configuration format');
}
return $parser;
}
/**
* Checks `$path` to see if it is either an array, a directory, or a file
*
* @param string|array $path
*
* @return array
*
* @throws EmptyDirectoryException If `$path` is an empty directory
*
* @throws FileNotFoundException If a file is not found at `$path`
*/
private function getValidPath($path)
{
// If `$path` is array
if (is_array($path)) {
$paths = array();
foreach ($path as $unverifiedPath) {
try {
// Check if `$unverifiedPath` is optional
// If it exists, then it's added to the list
// If it doesn't, it throws an exception which we catch
if ($unverifiedPath[0] !== '?') {
$paths = array_merge($paths, $this->getValidPath($unverifiedPath));
continue;
}
$optionalPath = ltrim($unverifiedPath, '?');
$paths = array_merge($paths, $this->getValidPath($optionalPath));
} catch (FileNotFoundException $e) {
// If `$unverifiedPath` is optional, then skip it
if ($unverifiedPath[0] === '?') {
continue;
}
// Otherwise rethrow the exception
throw $e;
}
}
return $paths;
}
// If `$path` is a directory
if (is_dir($path)) {
$paths = glob($path . '/*.*');
if (empty($paths)) {
throw new EmptyDirectoryException("Configuration directory: [$path] is empty");
}
return $paths;
}
// If `$path` is not a file, throw an exception
if (!file_exists($path)) {
throw new FileNotFoundException("Configuration file: [$path] cannot be found");
}
return array($path);
}
}