1
|
|
|
<?php declare(strict_types=1); |
2
|
|
|
|
3
|
|
|
namespace Simplex; |
4
|
|
|
|
5
|
|
|
use Dotenv\Dotenv; |
6
|
|
|
|
7
|
|
|
class Environment |
8
|
|
|
{ |
9
|
|
|
const SIMPLEX_ENVIRONMENT_ENV_VAR = 'SIMPLEX_ENV'; |
10
|
|
|
const COMPILE_CONTAINER_ENV_VAR = 'COMPILE_CONTAINER'; |
11
|
|
|
const ENABLE_CACHE_ENV_VAR = 'ENABLE_CACHE'; |
12
|
|
|
const DEBUG_MODE_ENV_VAR = 'DEBUG_MODE'; |
13
|
|
|
const EDITOR_ENV_VAR = 'EDITOR'; |
14
|
|
|
|
15
|
|
|
const DOTENV_FILE_NAME = '.env'; |
16
|
|
|
|
17
|
|
|
const DEFAULT_ENVIRONMENT = 'dev'; |
18
|
|
|
const COMPILE_CONTAINER_DEFAULT = '0'; |
19
|
|
|
const DEFAULT_CACHE_DIRECTORY = 'cache'; |
20
|
|
|
|
21
|
|
|
const REQUIRED_VARIABLE_DEFAULTS = [ |
22
|
|
|
self::SIMPLEX_ENVIRONMENT_ENV_VAR => self::DEFAULT_ENVIRONMENT, |
23
|
|
|
self::COMPILE_CONTAINER_ENV_VAR => self::COMPILE_CONTAINER_DEFAULT, |
24
|
|
|
]; |
25
|
|
|
|
26
|
|
|
/** @var \SplFileInfo */ |
27
|
|
|
private $configDirectory; |
28
|
|
|
|
29
|
|
|
/** @var bool */ |
30
|
|
|
private $loaded = false; |
31
|
|
|
|
32
|
|
|
public function load(\SplFileInfo $configDirectory): void |
33
|
|
|
{ |
34
|
|
|
$this->configDirectory = $configDirectory; |
35
|
|
|
|
36
|
|
|
$dotEnvFile = $this->getDotEnvFile(); |
37
|
|
|
|
38
|
|
|
$this->loadDotEnvParameters($dotEnvFile); |
39
|
|
|
|
40
|
|
|
$this->ensureRequireVariablesLoaded(); |
41
|
|
|
|
42
|
|
|
if (!defined('CACHE_DIRECTORY')) { |
43
|
|
|
define('CACHE_DIRECTORY', $this->getDefaultCacheDirectory()); |
44
|
|
|
} |
45
|
|
|
|
46
|
|
|
$this->loaded = true; |
47
|
|
|
} |
48
|
|
|
|
49
|
|
|
private function getDotEnvFile(): \SplFileInfo |
50
|
|
|
{ |
51
|
|
|
return new \SplFileInfo( |
52
|
|
|
$this->configDirectory->getPathname() |
53
|
|
|
. DIRECTORY_SEPARATOR |
54
|
|
|
. '..' |
55
|
|
|
. DIRECTORY_SEPARATOR |
56
|
|
|
. self::DOTENV_FILE_NAME |
57
|
|
|
); |
58
|
|
|
} |
59
|
|
|
|
60
|
|
|
private function loadDotEnvParameters(\SplFileInfo $dotEnvFile): void |
61
|
|
|
{ |
62
|
|
|
if ($dotEnvFile->isReadable()) { |
63
|
|
|
$dotenv = new Dotenv($dotEnvFile->getPath()); |
64
|
|
|
$dotenv->load(); |
65
|
|
|
} |
66
|
|
|
} |
67
|
|
|
|
68
|
|
|
private function ensureRequireVariablesLoaded(): void |
69
|
|
|
{ |
70
|
|
|
foreach (self::REQUIRED_VARIABLE_DEFAULTS as $variableName => $defaultValue) { |
71
|
|
|
if (empty(getenv($variableName))) { |
72
|
|
|
putenv($variableName . '=' . $defaultValue); |
73
|
|
|
} |
74
|
|
|
} |
75
|
|
|
} |
76
|
|
|
|
77
|
|
|
private function getDefaultCacheDirectory(): string |
78
|
|
|
{ |
79
|
|
|
return $this->configDirectory->getPath() |
80
|
|
|
. DIRECTORY_SEPARATOR |
81
|
|
|
. self::DEFAULT_CACHE_DIRECTORY; |
82
|
|
|
} |
83
|
|
|
|
84
|
|
|
public function getSimplexEnvironment(): string |
85
|
|
|
{ |
86
|
|
|
if (!$this->loaded) { |
87
|
|
|
throw new \LogicException('Environment variables not loaded'); |
88
|
|
|
} |
89
|
|
|
|
90
|
|
|
return getenv(self::SIMPLEX_ENVIRONMENT_ENV_VAR); |
91
|
|
|
} |
92
|
|
|
|
93
|
|
|
public function getCompileContainer(): bool |
94
|
|
|
{ |
95
|
|
|
if (!$this->loaded) { |
96
|
|
|
throw new \LogicException('Environment variables not loaded'); |
97
|
|
|
} |
98
|
|
|
|
99
|
|
|
return (bool) getenv(self::COMPILE_CONTAINER_ENV_VAR); |
100
|
|
|
} |
101
|
|
|
} |
102
|
|
|
|