diff --git a/.env.develop b/.env.develop index 968fd4b..07b491f 100644 --- a/.env.develop +++ b/.env.develop @@ -3,21 +3,22 @@ # composer: Set cache directory COMPOSER_CACHE_DIR=./.composer -# MariaDB container +# Environment variables for MariaDB container MYSQL_RANDOM_ROOT_PASSWORD=yes MYSQL_DATABASE=mailusers MYSQL_USER=mailaccountadmin MYSQL_PASSWORD=mailaccountadmin # App settings +APP_ENV=development APP_DEBUG=true +APP_TIMEZONE=Europe/Berlin -# - Disable Twig cache +# Disable Twig cache TWIG_CACHE_DIR= -TWIG_STRICT=true -# - Database credentials +# Database credentials DB_HOST=db DB_DATABASE=mailusers -DB_USER=mailaccountadmin +DB_USERNAME=mailaccountadmin DB_PASSWORD=mailaccountadmin diff --git a/Dockerfile b/Dockerfile index 695e69b..9f9d176 100644 --- a/Dockerfile +++ b/Dockerfile @@ -18,8 +18,6 @@ RUN cp $PHP_INI_DIR/php.ini-development $PHP_INI_DIR/php.ini && \ pecl install xdebug && \ docker-php-ext-enable xdebug -ENV APP_ENV=development - # TODO: production image untested #FROM base AS production # diff --git a/public/index.php b/public/index.php index 37641db..10628de 100644 --- a/public/index.php +++ b/public/index.php @@ -3,19 +3,19 @@ declare(strict_types=1); require_once __DIR__ . '/../vendor/autoload.php'; +use MailAccountAdmin\Config\Loaders\EnvConfigLoader; use MailAccountAdmin\Dependencies; use MailAccountAdmin\Middlewares; use MailAccountAdmin\Routes; -use MailAccountAdmin\Settings; use Slim\Factory\AppFactory; session_start(); -$settings = new Settings(); -$container = Dependencies::createContainer($settings); +$config = EnvConfigLoader::loadFromEnv(); +$container = Dependencies::createContainer($config); $app = AppFactory::createFromContainer($container); -Middlewares::setMiddlewares($app, $settings); +Middlewares::setMiddlewares($app, $config); Routes::setRoutes($app); $app->run(); diff --git a/src/Config/AppConfig.php b/src/Config/AppConfig.php new file mode 100644 index 0000000..4735a10 --- /dev/null +++ b/src/Config/AppConfig.php @@ -0,0 +1,92 @@ +timezone = ini_get('date.timezone') ?: 'UTC'; + } + + public static function createFromArray(array $configArray): self + { + $config = new self(); + + foreach ($configArray as $key => $value) { + assert(property_exists($config, $key)); + + if ($value !== null) { + $config->$key = $value; + } + } + + return $config; + } + + public function getAppTitle(): string + { + return $this->appTitle; + } + + public function getAppEnvironment(): string + { + return $this->environment; + } + + public function isDebugMode(): bool + { + return $this->debug; + } + + public function getTimezone(): string + { + return $this->timezone; + } + + public function getDateTimeFormat(): string + { + // Specify datetime format (https://www.php.net/manual/en/datetime.format.php) + // Default value "r": RFC 2822 formatted date (Thu, 21 Dec 2000 16:01:07 +0200) + return $this->dateTimeFormat; + } + + public function getTwigSettings(): array + { + return [ + 'cache' => $this->twigCacheDir ?: false, + 'debug' => $this->isDebugMode(), + 'strict_variables' => $this->isDebugMode(), + ]; + } + + public function getDatabaseSettings(): array + { + return [ + 'host' => $this->databaseHost, + 'port' => $this->databasePort, + 'dbname' => $this->databaseName, + 'username' => $this->databaseUsername, + 'password' => $this->databasePassword, + ]; + } +} diff --git a/src/Config/Loaders/EnvConfigLoader.php b/src/Config/Loaders/EnvConfigLoader.php new file mode 100644 index 0000000..06378f8 --- /dev/null +++ b/src/Config/Loaders/EnvConfigLoader.php @@ -0,0 +1,31 @@ + getenv('APP_TITLE') ?: null, + 'environment' => getenv('APP_ENV') ?: null, + 'debug' => getenv('APP_DEBUG') === 'true' ? true : null, + 'timezone' => getenv('APP_TIMEZONE') ?: null, + 'dateTimeFormat' => getenv('APP_DATE_TIME_FORMAT') ?: null, + + // Twig settings + 'twigCacheDir' => getenv('TWIG_CACHE_DIR') ?: null, + + // Database settings + 'databaseHost' => getenv('DB_HOST') ?: null, + 'databasePort' => (int)getenv('DB_PORT') ?: null, + 'databaseName' => getenv('DB_DATABASE') ?: null, + 'databaseUsername' => getenv('DB_USERNAME') ?: null, + 'databasePassword' => getenv('DB_PASSWORD') ?: null, + ]); + } +} diff --git a/src/Dependencies.php b/src/Dependencies.php index 94c0d64..30dd467 100644 --- a/src/Dependencies.php +++ b/src/Dependencies.php @@ -7,6 +7,7 @@ use DI\Container; use MailAccountAdmin\Common\PasswordHelper; use MailAccountAdmin\Common\SessionHelper; use MailAccountAdmin\Common\UserHelper; +use MailAccountAdmin\Config\AppConfig; use MailAccountAdmin\Frontend\Accounts\AccountController; use MailAccountAdmin\Frontend\Accounts\AccountHandler; use MailAccountAdmin\Frontend\Domains\DomainController; @@ -23,43 +24,43 @@ use Twig\Extension\CoreExtension as TwigCoreExtension; class Dependencies { - public const SETTINGS = 'settings'; + public const CONFIG = 'config'; public const TWIG = 'view'; private const TWIG_TEMPLATE_DIR = __DIR__ . '/../templates'; public const DATABASE = 'database'; - public static function createContainer(Settings $settings): Container + public static function createContainer(AppConfig $config): Container { $container = new Container(); - // App settings - $container->set(self::SETTINGS, $settings); + // App configuration + $container->set(self::CONFIG, $config); // App information $container->set(AppInfo::class, function (ContainerInterface $c) { - /** @var Settings $settings */ - $settings = $c->get(self::SETTINGS); - $versionHelper = new VersionHelper(); + /** @var AppConfig $config */ + $config = $c->get(self::CONFIG); + $versionHelper = new VersionHelper($config); return new AppInfo( - $settings->getAppTitle(), + $config->getAppTitle(), $versionHelper->getAppVersion(), ); }); // Twig template engine $container->set(self::TWIG, function (ContainerInterface $c) { - /** @var Settings $settings */ - $settings = $c->get(self::SETTINGS); + /** @var AppConfig $config */ + $config = $c->get(self::CONFIG); // Create Twig view - $twig = Twig::create(self::TWIG_TEMPLATE_DIR, $settings->getTwigSettings()); + $twig = Twig::create(self::TWIG_TEMPLATE_DIR, $config->getTwigSettings()); // Set default date format /** @var TwigCoreExtension $coreExtension */ $coreExtension = $twig->getEnvironment()->getExtension(TwigCoreExtension::class); - $coreExtension->setDateFormat($settings->getDateFormat()); - $coreExtension->setTimezone($settings->getTimezone()); + $coreExtension->setDateFormat($config->getDateTimeFormat()); + $coreExtension->setTimezone($config->getTimezone()); // Add app information to globals $appInfo = $c->get(AppInfo::class); @@ -71,9 +72,9 @@ class Dependencies // Database connection $container->set(self::DATABASE, function (ContainerInterface $c) { - /** @var Settings $settings */ - $settings = $c->get(self::SETTINGS); - $dbSettings = $settings->getDatabaseSettings(); + /** @var AppConfig $config */ + $config = $c->get(self::CONFIG); + $dbSettings = $config->getDatabaseSettings(); return new PDO( "mysql:dbname={$dbSettings['dbname']};host={$dbSettings['host']};port={$dbSettings['port']}", @@ -108,7 +109,7 @@ class Dependencies }); // Helper classes - $container->set(SessionHelper::class, function (ContainerInterface $c) { + $container->set(SessionHelper::class, function () { return new SessionHelper(); }); @@ -120,7 +121,7 @@ class Dependencies ); }); - $container->set(PasswordHelper::class, function (ContainerInterface $c) { + $container->set(PasswordHelper::class, function () { return new PasswordHelper(); }); diff --git a/src/Middlewares.php b/src/Middlewares.php index 375e481..f60987f 100644 --- a/src/Middlewares.php +++ b/src/Middlewares.php @@ -4,14 +4,15 @@ declare(strict_types=1); namespace MailAccountAdmin; use MailAccountAdmin\Auth\AuthMiddleware; +use MailAccountAdmin\Config\AppConfig; use Slim\App; use Slim\Views\TwigMiddleware; class Middlewares { - public static function setMiddlewares(App $app, Settings $settings): void + public static function setMiddlewares(App $app, AppConfig $config): void { - $displayErrorDetails = $settings->isDebugMode(); + $displayErrorDetails = $config->isDebugMode(); $app->addErrorMiddleware($displayErrorDetails, true, true); $app->add(new AuthMiddleware()); diff --git a/src/Settings.php b/src/Settings.php deleted file mode 100644 index 4d1b989..0000000 --- a/src/Settings.php +++ /dev/null @@ -1,49 +0,0 @@ - getenv('TWIG_CACHE_DIR') ?: false, - 'debug' => $this->isDebugMode(), - 'strict_variables' => getenv('TWIG_STRICT') === 'true', - ]; - } - - public function getDatabaseSettings(): array - { - return [ - 'host' => getenv('DB_HOST') ?: 'localhost', - 'port' => getenv('DB_PORT') ?: 3306, - 'dbname' => getenv('DB_DATABASE') ?: '', - 'username' => getenv('DB_USER') ?: '', - 'password' => getenv('DB_PASSWORD') ?: '', - ]; - } -} diff --git a/src/VersionHelper.php b/src/VersionHelper.php index 4fd370a..1223bce 100644 --- a/src/VersionHelper.php +++ b/src/VersionHelper.php @@ -3,16 +3,18 @@ declare(strict_types=1); namespace MailAccountAdmin; +use MailAccountAdmin\Config\AppConfig; + class VersionHelper { private string $version; - public function __construct() + public function __construct(AppConfig $config) { $version = $this->loadFromVersionFile(); if (!empty($version)) { $this->version = $version; - } elseif ($this->inDevelopmentMode()) { + } elseif ($config->getAppEnvironment() === 'development') { $this->version = '[dev version]'; } else { $this->version = '[undefined version]'; @@ -34,9 +36,4 @@ class VersionHelper } return null; } - - private function inDevelopmentMode(): bool - { - return getenv('APP_ENV') === 'development'; - } }