1
|
|
|
<?php |
2
|
|
|
declare(strict_types=1); |
3
|
|
|
|
4
|
|
|
|
5
|
|
|
namespace Xervice\Config; |
6
|
|
|
|
7
|
|
|
|
8
|
|
|
use Xervice\Config\Container\ConfigContainer; |
9
|
|
|
|
10
|
|
|
class XerviceConfig |
11
|
|
|
{ |
12
|
|
|
public const APPLICATION_PATH = 'APPLICATION_PATH'; |
13
|
|
|
|
14
|
|
|
public const ADDITIONAL_CONFIG_FILES = 'ADDITIONAL_CONFIG_FILES'; |
15
|
|
|
|
16
|
|
|
/** |
17
|
|
|
* @var \Xervice\Config\XerviceConfig |
18
|
|
|
*/ |
19
|
|
|
private static $instance; |
20
|
|
|
|
21
|
|
|
/** |
22
|
|
|
* @var \Xervice\Config\XerviceConfigFactory |
23
|
|
|
*/ |
24
|
|
|
private $factory; |
25
|
|
|
|
26
|
|
|
/** |
27
|
|
|
* @var \Xervice\Config\Parser\Parser |
28
|
|
|
*/ |
29
|
|
|
private $parser; |
30
|
|
|
|
31
|
|
|
/** |
32
|
|
|
* XerviceConfig constructor. |
33
|
|
|
* |
34
|
|
|
* @param \Xervice\Config\XerviceConfigFactory $factory |
35
|
|
|
*/ |
36
|
8 |
|
public function __construct(XerviceConfigFactory $factory) |
37
|
|
|
{ |
38
|
8 |
|
$this->factory = $factory; |
39
|
8 |
|
$this->parser = $this->factory->createParser(); |
40
|
8 |
|
$this->init(); |
41
|
8 |
|
} |
42
|
|
|
|
43
|
|
|
/** |
44
|
|
|
* @return \Xervice\Config\XerviceConfig |
45
|
|
|
*/ |
46
|
|
|
public static function getInstance(): XerviceConfig |
47
|
|
|
{ |
48
|
|
|
if (self::$instance === null) { |
49
|
|
|
self::$instance = new self(new XerviceConfigFactory()); |
50
|
|
|
} |
51
|
|
|
return self::$instance; |
52
|
|
|
} |
53
|
|
|
|
54
|
|
|
/** |
55
|
|
|
* @return \Xervice\Config\Container\ConfigContainer |
56
|
|
|
*/ |
57
|
8 |
|
public function getConfig(): ConfigContainer |
58
|
|
|
{ |
59
|
8 |
|
return $this->factory->getConfigContainer(); |
60
|
|
|
} |
61
|
|
|
|
62
|
|
|
/** |
63
|
|
|
* @param string $file |
64
|
|
|
*/ |
65
|
8 |
|
private function parseFileIfExist(string $file): void |
66
|
|
|
{ |
67
|
8 |
|
$this->parser->parseFile($file); |
68
|
8 |
|
} |
69
|
|
|
|
70
|
8 |
|
private function init(): void |
71
|
|
|
{ |
72
|
8 |
|
$environment = $this->factory->createEnvironment(); |
73
|
8 |
|
$rootPath = $this->getRootPath(); |
74
|
8 |
|
$configDir = $this->getConfigPath($rootPath); |
75
|
|
|
|
76
|
8 |
|
$this->parseFileIfExist($configDir . '/config_default.php'); |
77
|
8 |
|
$this->parseFileIfExist($configDir . '/config_' . $environment->getEnvironment() . '.php'); |
78
|
8 |
|
$this->parseFileIfExist($configDir . '/config_local.php'); |
79
|
|
|
|
80
|
8 |
|
$additionalFiles = (array)$this->getConfig()->get(self::ADDITIONAL_CONFIG_FILES, []); |
81
|
8 |
|
if ($additionalFiles) { |
|
|
|
|
82
|
7 |
|
foreach ($additionalFiles as $file) { |
83
|
7 |
|
$this->parseFileIfExist($file); |
84
|
|
|
} |
85
|
|
|
} |
86
|
|
|
|
87
|
8 |
|
$this->factory->getConfigContainer()->set(self::APPLICATION_PATH, $rootPath); |
88
|
8 |
|
} |
89
|
|
|
|
90
|
|
|
/** |
91
|
|
|
* @return string |
92
|
|
|
*/ |
93
|
8 |
|
private function getRootPath(): string |
94
|
|
|
{ |
95
|
8 |
|
return getenv('APPLICATION_PATH') ?: getcwd(); |
96
|
|
|
} |
97
|
|
|
|
98
|
|
|
/** |
99
|
|
|
* @param $rootPath |
100
|
|
|
* |
101
|
|
|
* @return string |
102
|
|
|
*/ |
103
|
8 |
|
private function getConfigPath($rootPath): string |
104
|
|
|
{ |
105
|
8 |
|
return getenv('CONFIG_PATH') ?: $rootPath . '/config/'; |
106
|
|
|
} |
107
|
|
|
} |
108
|
|
|
|
This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.
Consider making the comparison explicit by using
empty(..)
or! empty(...)
instead.