63 lines
2.2 KiB
PHP
63 lines
2.2 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
|
|
namespace App;
|
|
|
|
final class Config
|
|
{
|
|
public function __construct(
|
|
public readonly string $env,
|
|
public readonly string $prefix,
|
|
public readonly string $primaryDomain,
|
|
public readonly string $primaryUrl,
|
|
public readonly string $apiBase,
|
|
public readonly string $assetVersion,
|
|
public readonly bool $dbEnabled,
|
|
public readonly array $db,
|
|
) {}
|
|
|
|
public static function fromPhpConstants(string $configDir): self
|
|
{
|
|
// config.php defines these constants.
|
|
$env = defined('APP_ENV') ? (string) APP_ENV : 'prod';
|
|
$prefix = defined('APP_PREFIX') ? (string) APP_PREFIX : 'app';
|
|
$primaryDom = defined('APP_DOMAIN_PRIMARY') ? (string) APP_DOMAIN_PRIMARY : 'example.test';
|
|
$primaryUrl = defined('APP_URL_PRIMARY') ? (string) APP_URL_PRIMARY : 'https://example.test';
|
|
$apiBase = defined('APP_API_BASE') ? (string) APP_API_BASE : ($primaryUrl . '/api');
|
|
$assetVersion = defined('ASSET_VERSION') ? (string) ASSET_VERSION : '';
|
|
|
|
$dbEnabled = defined('APP_DB_ENABLED') ? (bool) APP_DB_ENABLED : false;
|
|
|
|
$dbFileRoot = rtrim($configDir, '/\\') . DIRECTORY_SEPARATOR . 'db.php';
|
|
$dbFileEnv = rtrim($configDir, '/\\') . DIRECTORY_SEPARATOR . $env . DIRECTORY_SEPARATOR . 'db.php';
|
|
$dbFile = file_exists($dbFileRoot) ? $dbFileRoot : (file_exists($dbFileEnv) ? $dbFileEnv : null);
|
|
$db = $dbFile ? (array) require $dbFile : [];
|
|
|
|
return new self(
|
|
env: $env,
|
|
prefix: $prefix,
|
|
primaryDomain: $primaryDom,
|
|
primaryUrl: rtrim($primaryUrl, '/'),
|
|
apiBase: rtrim($apiBase, '/'),
|
|
assetVersion: $assetVersion,
|
|
dbEnabled: $dbEnabled,
|
|
db: $db
|
|
);
|
|
}
|
|
|
|
public function cookiePrefix(): string
|
|
{
|
|
// Example: add suffix for staging
|
|
if ($this->env === 'staging') {
|
|
return $this->prefix . '_stg_';
|
|
}
|
|
return $this->prefix . '_';
|
|
}
|
|
|
|
public function cookieDomain(): string
|
|
{
|
|
// Leading dot for subdomain-wide cookies
|
|
return '.' . ltrim($this->primaryDomain, '.');
|
|
}
|
|
}
|