Make some env vars immutable.
This commit is contained in:
parent
7d9470ba51
commit
e1203ecd6f
|
@ -8,9 +8,5 @@ ini_set('display_errors', '1');
|
||||||
|
|
||||||
require dirname(__DIR__) . '/vendor/autoload.php';
|
require dirname(__DIR__) . '/vendor/autoload.php';
|
||||||
|
|
||||||
$cli = App\AppFactory::createCli(
|
$cli = App\AppFactory::createCli();
|
||||||
[
|
|
||||||
App\Environment::BASE_DIR => dirname(__DIR__),
|
|
||||||
]
|
|
||||||
);
|
|
||||||
$cli->run();
|
$cli->run();
|
||||||
|
|
|
@ -8,11 +8,7 @@ ini_set('display_errors', '1');
|
||||||
|
|
||||||
$autoloader = require dirname(__DIR__) . '/vendor/autoload.php';
|
$autoloader = require dirname(__DIR__) . '/vendor/autoload.php';
|
||||||
|
|
||||||
$environment = App\AppFactory::buildEnvironment(
|
$environment = App\AppFactory::buildEnvironment();
|
||||||
[
|
|
||||||
App\Environment::BASE_DIR => dirname(__DIR__),
|
|
||||||
]
|
|
||||||
);
|
|
||||||
|
|
||||||
$console = new Symfony\Component\Console\Application(
|
$console = new Symfony\Component\Console\Application(
|
||||||
'AzuraCast installer',
|
'AzuraCast installer',
|
||||||
|
|
|
@ -8,7 +8,6 @@ use App\Console\Application;
|
||||||
use App\Enums\SupportedLocales;
|
use App\Enums\SupportedLocales;
|
||||||
use App\Http\Factory\ResponseFactory;
|
use App\Http\Factory\ResponseFactory;
|
||||||
use App\Http\Factory\ServerRequestFactory;
|
use App\Http\Factory\ServerRequestFactory;
|
||||||
use App\Utilities\File;
|
|
||||||
use App\Utilities\Logger as AppLogger;
|
use App\Utilities\Logger as AppLogger;
|
||||||
use DI;
|
use DI;
|
||||||
use Monolog\ErrorHandler;
|
use Monolog\ErrorHandler;
|
||||||
|
@ -95,11 +94,7 @@ final class AppFactory
|
||||||
|
|
||||||
$containerBuilder->addDefinitions($diDefinitions);
|
$containerBuilder->addDefinitions($diDefinitions);
|
||||||
|
|
||||||
// Check for services.php file and include it if one exists.
|
$containerBuilder->addDefinitions(dirname(__DIR__) . '/config/services.php');
|
||||||
$configDir = $environment->getConfigDirectory();
|
|
||||||
if (file_exists($configDir . '/services.php')) {
|
|
||||||
$containerBuilder->addDefinitions($configDir . '/services.php');
|
|
||||||
}
|
|
||||||
|
|
||||||
$di = $containerBuilder->build();
|
$di = $containerBuilder->build();
|
||||||
|
|
||||||
|
@ -118,42 +113,7 @@ final class AppFactory
|
||||||
*/
|
*/
|
||||||
public static function buildEnvironment(array $environment = []): Environment
|
public static function buildEnvironment(array $environment = []): Environment
|
||||||
{
|
{
|
||||||
if (!isset($environment[Environment::BASE_DIR])) {
|
|
||||||
throw new Exception\BootstrapException('No base directory specified!');
|
|
||||||
}
|
|
||||||
|
|
||||||
$baseDir = $environment[Environment::BASE_DIR];
|
|
||||||
$parentBaseDir = dirname($baseDir);
|
|
||||||
|
|
||||||
$environment[Environment::IS_DOCKER] = file_exists($parentBaseDir . '/.docker');
|
|
||||||
|
|
||||||
$environment[Environment::TEMP_DIR] ??= $parentBaseDir . '/www_tmp';
|
|
||||||
$environment[Environment::CONFIG_DIR] ??= $baseDir . '/config';
|
|
||||||
$environment[Environment::VIEWS_DIR] ??= $baseDir . '/templates';
|
|
||||||
$environment[Environment::UPLOADS_DIR] ??= File::getFirstExistingDirectory([
|
|
||||||
$parentBaseDir . '/storage/uploads',
|
|
||||||
$parentBaseDir . '/uploads',
|
|
||||||
]);
|
|
||||||
|
|
||||||
$_ENV = getenv();
|
$_ENV = getenv();
|
||||||
|
|
||||||
if (!$environment[Environment::IS_DOCKER]) {
|
|
||||||
$envPaths = [
|
|
||||||
$parentBaseDir . '/env.ini',
|
|
||||||
$baseDir . '/env.ini',
|
|
||||||
];
|
|
||||||
|
|
||||||
foreach ($envPaths as $envPath) {
|
|
||||||
if (file_exists($envPath)) {
|
|
||||||
$envIni = parse_ini_file($envPath);
|
|
||||||
if (false !== $envIni) {
|
|
||||||
$_ENV = array_merge($_ENV, $envIni);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$environment = array_merge(array_filter($_ENV), $environment);
|
$environment = array_merge(array_filter($_ENV), $environment);
|
||||||
|
|
||||||
return new Environment($environment);
|
return new Environment($environment);
|
||||||
|
|
|
@ -57,9 +57,9 @@ final class GenerateCommand extends CommandAbstract
|
||||||
|
|
||||||
// Find all PHP/PHTML files in the application's code.
|
// Find all PHP/PHTML files in the application's code.
|
||||||
$translatableFolders = [
|
$translatableFolders = [
|
||||||
$this->environment->getBaseDirectory() . '/src',
|
dirname(__DIR__, 4) . '/src',
|
||||||
$this->environment->getBaseDirectory() . '/config',
|
dirname(__DIR__, 4) . '/config',
|
||||||
$this->environment->getViewsDirectory(),
|
dirname(__DIR__, 4) . '/templates',
|
||||||
];
|
];
|
||||||
|
|
||||||
$phpScanner = new PhpScanner($translations);
|
$phpScanner = new PhpScanner($translations);
|
||||||
|
|
|
@ -7,6 +7,7 @@ namespace App;
|
||||||
use App\Enums\ApplicationEnvironment;
|
use App\Enums\ApplicationEnvironment;
|
||||||
use App\Enums\ReleaseChannel;
|
use App\Enums\ReleaseChannel;
|
||||||
use App\Radio\Configuration;
|
use App\Radio\Configuration;
|
||||||
|
use App\Utilities\File;
|
||||||
use GuzzleHttp\Psr7\Uri;
|
use GuzzleHttp\Psr7\Uri;
|
||||||
use Psr\Http\Message\UriInterface;
|
use Psr\Http\Message\UriInterface;
|
||||||
use Psr\Log\LogLevel;
|
use Psr\Log\LogLevel;
|
||||||
|
@ -15,16 +16,19 @@ final class Environment
|
||||||
{
|
{
|
||||||
private static Environment $instance;
|
private static Environment $instance;
|
||||||
|
|
||||||
private array $data;
|
// Cached immutable values that are frequently used.
|
||||||
|
private readonly string $baseDir;
|
||||||
|
private readonly string $parentDir;
|
||||||
|
private readonly bool $isDocker;
|
||||||
|
private readonly ApplicationEnvironment $appEnv;
|
||||||
|
|
||||||
|
private readonly array $data;
|
||||||
|
|
||||||
// Core settings values
|
// Core settings values
|
||||||
public const APP_NAME = 'APP_NAME';
|
public const APP_NAME = 'APP_NAME';
|
||||||
public const APP_ENV = 'APPLICATION_ENV';
|
public const APP_ENV = 'APPLICATION_ENV';
|
||||||
|
|
||||||
public const BASE_DIR = 'BASE_DIR';
|
|
||||||
public const TEMP_DIR = 'TEMP_DIR';
|
public const TEMP_DIR = 'TEMP_DIR';
|
||||||
public const CONFIG_DIR = 'CONFIG_DIR';
|
|
||||||
public const VIEWS_DIR = 'VIEWS_DIR';
|
|
||||||
public const UPLOADS_DIR = 'UPLOADS_DIR';
|
public const UPLOADS_DIR = 'UPLOADS_DIR';
|
||||||
|
|
||||||
public const IS_DOCKER = 'IS_DOCKER';
|
public const IS_DOCKER = 'IS_DOCKER';
|
||||||
|
@ -96,7 +100,13 @@ final class Environment
|
||||||
|
|
||||||
public function __construct(array $elements = [])
|
public function __construct(array $elements = [])
|
||||||
{
|
{
|
||||||
|
$this->baseDir = dirname(__DIR__);
|
||||||
|
$this->parentDir = dirname($this->baseDir);
|
||||||
|
$this->isDocker = file_exists($this->parentDir . '/.docker');
|
||||||
|
|
||||||
$this->data = array_merge($this->defaults, $elements);
|
$this->data = array_merge($this->defaults, $elements);
|
||||||
|
$this->appEnv = ApplicationEnvironment::tryFrom($this->data[self::APP_ENV] ?? '')
|
||||||
|
?? ApplicationEnvironment::default();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -109,8 +119,7 @@ final class Environment
|
||||||
|
|
||||||
public function getAppEnvironmentEnum(): ApplicationEnvironment
|
public function getAppEnvironmentEnum(): ApplicationEnvironment
|
||||||
{
|
{
|
||||||
return ApplicationEnvironment::tryFrom($this->data[self::APP_ENV] ?? '')
|
return $this->appEnv;
|
||||||
?? ApplicationEnvironment::default();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function isProduction(): bool
|
public function isProduction(): bool
|
||||||
|
@ -139,7 +148,7 @@ final class Environment
|
||||||
|
|
||||||
public function isDocker(): bool
|
public function isDocker(): bool
|
||||||
{
|
{
|
||||||
return self::envToBool($this->data[self::IS_DOCKER] ?? true);
|
return $this->isDocker;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function isCli(): bool
|
public function isCli(): bool
|
||||||
|
@ -162,39 +171,7 @@ final class Environment
|
||||||
*/
|
*/
|
||||||
public function getBaseDirectory(): string
|
public function getBaseDirectory(): string
|
||||||
{
|
{
|
||||||
return $this->data[self::BASE_DIR];
|
return $this->baseDir;
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string The directory where temporary files are stored by the application, i.e. `/var/app/www_tmp`
|
|
||||||
*/
|
|
||||||
public function getTempDirectory(): string
|
|
||||||
{
|
|
||||||
return $this->data[self::TEMP_DIR];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string The directory where configuration files are stored by default.
|
|
||||||
*/
|
|
||||||
public function getConfigDirectory(): string
|
|
||||||
{
|
|
||||||
return $this->data[self::CONFIG_DIR];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string The directory where template/view files are stored.
|
|
||||||
*/
|
|
||||||
public function getViewsDirectory(): string
|
|
||||||
{
|
|
||||||
return $this->data[self::VIEWS_DIR];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string The directory where user system-level uploads are stored.
|
|
||||||
*/
|
|
||||||
public function getUploadsDirectory(): string
|
|
||||||
{
|
|
||||||
return $this->data[self::UPLOADS_DIR];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -202,7 +179,27 @@ final class Environment
|
||||||
*/
|
*/
|
||||||
public function getParentDirectory(): string
|
public function getParentDirectory(): string
|
||||||
{
|
{
|
||||||
return dirname($this->getBaseDirectory());
|
return $this->parentDir;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string The directory where temporary files are stored by the application, i.e. `/var/app/www_tmp`
|
||||||
|
*/
|
||||||
|
public function getTempDirectory(): string
|
||||||
|
{
|
||||||
|
return $this->data[self::TEMP_DIR]
|
||||||
|
?? $this->getParentDirectory() . '/www_tmp';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string The directory where user system-level uploads are stored.
|
||||||
|
*/
|
||||||
|
public function getUploadsDirectory(): string
|
||||||
|
{
|
||||||
|
return $this->data[self::UPLOADS_DIR] ?? File::getFirstExistingDirectory([
|
||||||
|
$this->getParentDirectory() . '/storage/uploads',
|
||||||
|
$this->getParentDirectory() . '/uploads',
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -13,7 +13,6 @@ use App\AppFactory;
|
||||||
use App\Doctrine\ReloadableEntityManagerInterface;
|
use App\Doctrine\ReloadableEntityManagerInterface;
|
||||||
use App\Enums\ApplicationEnvironment;
|
use App\Enums\ApplicationEnvironment;
|
||||||
use App\Environment;
|
use App\Environment;
|
||||||
use Codeception\Configuration;
|
|
||||||
use Codeception\Lib\Framework;
|
use Codeception\Lib\Framework;
|
||||||
use Codeception\Lib\Interfaces\DoctrineProvider;
|
use Codeception\Lib\Interfaces\DoctrineProvider;
|
||||||
use Codeception\Lib\ModuleContainer;
|
use Codeception\Lib\ModuleContainer;
|
||||||
|
@ -39,12 +38,10 @@ class Module extends Framework implements DoctrineProvider
|
||||||
$this->requiredFields = ['container'];
|
$this->requiredFields = ['container'];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public function _initialize(): void
|
public function _initialize(): void
|
||||||
{
|
{
|
||||||
$this->app = AppFactory::createApp(
|
$this->app = AppFactory::createApp(
|
||||||
[
|
[
|
||||||
Environment::BASE_DIR => Configuration::projectDir(),
|
|
||||||
Environment::APP_ENV => ApplicationEnvironment::Testing->value,
|
Environment::APP_ENV => ApplicationEnvironment::Testing->value,
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
|
|
|
@ -38,7 +38,10 @@ final class View extends Engine
|
||||||
Version $version,
|
Version $version,
|
||||||
RouterInterface $router
|
RouterInterface $router
|
||||||
) {
|
) {
|
||||||
parent::__construct($environment->getViewsDirectory(), 'phtml');
|
parent::__construct(
|
||||||
|
dirname(__DIR__) . '/templates',
|
||||||
|
'phtml'
|
||||||
|
);
|
||||||
|
|
||||||
$this->sections = new GlobalSections();
|
$this->sections = new GlobalSections();
|
||||||
$this->globalProps = new ArrayCollection();
|
$this->globalProps = new ArrayCollection();
|
||||||
|
|
|
@ -12,8 +12,11 @@ const AZURACAST_VERSION = App\Version::FALLBACK_VERSION;
|
||||||
const AZURACAST_API_URL = 'https://localhost/api';
|
const AZURACAST_API_URL = 'https://localhost/api';
|
||||||
const AZURACAST_API_NAME = 'Testing API';
|
const AZURACAST_API_NAME = 'Testing API';
|
||||||
|
|
||||||
|
$tempDir = sys_get_temp_dir();
|
||||||
|
|
||||||
App\AppFactory::createCli(
|
App\AppFactory::createCli(
|
||||||
[
|
[
|
||||||
App\Environment::BASE_DIR => dirname(__DIR__),
|
App\Environment::TEMP_DIR => $tempDir,
|
||||||
|
App\Environment::UPLOADS_DIR => $tempDir,
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
|
|
|
@ -3,17 +3,11 @@
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
use App\AppFactory;
|
use App\AppFactory;
|
||||||
use App\Environment;
|
|
||||||
|
|
||||||
error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT);
|
error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT);
|
||||||
ini_set('display_errors', '1');
|
ini_set('display_errors', '1');
|
||||||
|
|
||||||
require dirname(__DIR__) . '/vendor/autoload.php';
|
require dirname(__DIR__) . '/vendor/autoload.php';
|
||||||
|
|
||||||
$app = AppFactory::createApp(
|
$app = AppFactory::createApp();
|
||||||
[
|
|
||||||
Environment::BASE_DIR => dirname(__DIR__),
|
|
||||||
]
|
|
||||||
);
|
|
||||||
|
|
||||||
$app->run();
|
$app->run();
|
||||||
|
|
Loading…
Reference in New Issue