| 
<?phpnamespace Frdlweb\Environment;
 
 
 use Symfony\Component\Dotenv\Dotenv;
 use Exception;
 
 
 class Environment {
 
 /**
 * Active environment variable
 *
 * @var string
 */
 protected $file = '';
 
 /**
 * Path prefix for environment files
 *
 * @var string
 */
 protected $path = '';
 
 /**
 * File
 *
 * @var  mixed
 */
 protected $root = '~/';
 
 
 protected $pfx = '.env.';
 
 protected $host = null;
 
 protected $required = true;
 
 public function __construct(?string $dir = null, ?string $pfx = null){
 
 $this->host = $this->getHost();
 
 if(!is_string($pfx)){
 $this->pfx = '.env.';
 }else{
 $this->pfx = $pfx;
 }
 
 if(!is_string($dir)){
 //  $this->dir($this->getRootDir(null));
 $this->dir(getcwd());
 }else{
 $this->dir($dir);
 }
 }
 
 public function getRootDir($path = null){
 if(null===$path){
 $path = $_SERVER['DOCUMENT_ROOT'];
 }
 
 if(''!==dirname($path) && '/'!==dirname($path) //&& @chmod(dirname($path), 0755)
 &&  true===@is_writable(dirname($path))
 ){
 return $this->getRootDir(dirname($path));
 }else{
 return $path;
 }
 }
 
 
 /**
 * Setting path prefix
 *
 * @param  string       $path
 * @return this
 */
 public function path($path)
 {
 $this->path = $path;
 return $this;
 }
 
 /**
 * Setting file
 *
 * @param  string       $file
 * @return this
 */
 public function dir($root)
 {
 
 //  $root = realpath($root);
 
 
 $this->root = $root;
 return $this;
 }
 
 /**
 * Environment detection
 *
 * @param  array        $setups
 * @return null
 */
 public function detectEnvironment(Array $setups)
 {
 foreach ($setups as $environment => $setup) {
 
 foreach ($setup['hosts'] as $index => $hostname) {
 if ('*' ===$hostname || $hostname === $this->host) {
 if(isset($setup['required']) && is_bool($setup['required'])){
 $this->required = $setup['required'];
 }else{
 $this->required = true;
 }
 
 $this->file = $environment;
 $this->loadEnvironmentVariables();
 }
 }
 }
 return $this;
 }
 
 
 public function host(?string $host = null){
 if(null!==$host){
 $this->host = $host;
 }else{
 $this->host = $this->getHost();
 }
 }
 
 
 public function getHost(){
 if(isset($_SERVER['SERVER_NAME'])){
 return $_SERVER['SERVER_NAME'];
 }elseif(isset($_SERVER['HTTP_HOST'])){
 return $_SERVER['HTTP_HOST'];
 }elseif(isset($_SERVER['HTTP_X_FORWARDED_HOST'])){
 return $_SERVER['HTTP_X_FORWARDED_HOST'];
 }else{
 return gethostname();
 }
 }
 
 /**
 * Loading environment variables
 *
 * @return null
 */
 private function loadEnvironmentVariables()
 {
 $dotenv = new Dotenv();
 $environments = $this->getFromFile();
 foreach ($environments as $key => $value) {
 if (is_object($value)) {
 foreach ($value as $sub => $subValue) {
 putenv("{$key}_{$sub}=$subValue");
 $dotenv->populate([$key.'_'.$sub => $subValue], true);
 }
 } else {
 putenv("$key=$value");
 $dotenv->populate([$key => $value], true);
 }
 }
 }
 
 /**
 * Getting from file
 *
 * @return array
 */
 private function getFromFile()
 {
 $root  = $this->root;
 
 if(!\is_array($root)){
 $root = [$root];
 }
 
 
 foreach($root as $d){
 $p ='';
 $res =[];
 $tokens = \explode('\\/', $d);
 foreach($tokens as $t){
 $p .= \DIRECTORY_SEPARATOR.$t;
 if(\strlen(getenv('HOME')) >= \strlen(\substr($p, 0, strlen(getenv('HOME'))))){
 continue;
 }
 
 
 $filePath = rtrim(
 rtrim($p, '\\/').\DIRECTORY_SEPARATOR
 
 .rtrim($this->path, '\\/').\DIRECTORY_SEPARATOR
 
 .$this->pfx
 
 .$this->file,
 
 '.'
 
 );
 
 if(file_exists($filePath)) {
 $dotenv = new Dotenv();
 $res = $dotenv->parse(file_get_contents($filePath));
 }elseif(file_exists($filePath.'.json')) {
 $res = json_decode(file_get_contents($filePath.'.json'));
 }elseif(file_exists($filePath.'.php')) {
 $res = require($filePath.'.php');
 }elseif(true === $this->required){
 throw new Exception("Environment file is not found: $filePath{|.json|.php}");
 }else{
 return $res;
 }
 
 }
 
 
 }
 
 return $res;
 }
 
 }
 
 |