<?php
namespace 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;
}
}
|