From 2bb7ea54a23f143277f6afafe3456da98355b197 Mon Sep 17 00:00:00 2001 From: binaryDiv Date: Mon, 26 Jul 2021 23:14:14 +0200 Subject: [PATCH] Add MariaDB container; add PDO connection; add error middleware --- .env.develop | 20 ++++++++++++++++++-- docker-compose.yml | 15 +++++++++++++++ public/index.php | 2 +- src/Dependencies.php | 22 ++++++++++++++++++++-- src/Middlewares.php | 5 ++++- src/Settings.php | 21 ++++++++++++++++++--- 6 files changed, 76 insertions(+), 9 deletions(-) diff --git a/.env.develop b/.env.develop index e6cfe04..968fd4b 100644 --- a/.env.develop +++ b/.env.develop @@ -1,7 +1,23 @@ # .env.development: Environment variables for local development -# Set composer cache directory +# composer: Set cache directory COMPOSER_CACHE_DIR=./.composer -# Disable Twig cache +# MariaDB container +MYSQL_RANDOM_ROOT_PASSWORD=yes +MYSQL_DATABASE=mailusers +MYSQL_USER=mailaccountadmin +MYSQL_PASSWORD=mailaccountadmin + +# App settings +APP_DEBUG=true + +# - Disable Twig cache TWIG_CACHE_DIR= +TWIG_STRICT=true + +# - Database credentials +DB_HOST=db +DB_DATABASE=mailusers +DB_USER=mailaccountadmin +DB_PASSWORD=mailaccountadmin diff --git a/docker-compose.yml b/docker-compose.yml index f91cc48..f59e2d4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -12,3 +12,18 @@ services: volumes: - ./:/var/www/ user: ${DOCKER_UID} + + db: + image: mariadb + env_file: + - .env.develop + volumes: + - db_data:/var/lib/mysql + + adminer: + image: adminer + ports: + - 8099:8080 + +volumes: + db_data: diff --git a/public/index.php b/public/index.php index 34eb697..60dd1c2 100644 --- a/public/index.php +++ b/public/index.php @@ -13,7 +13,7 @@ $settings = new Settings(); $container = Dependencies::createContainer($settings); $app = AppFactory::createFromContainer($container); -Middlewares::setMiddlewares($app); +Middlewares::setMiddlewares($app, $settings); Routes::setRoutes($app); $app->run(); diff --git a/src/Dependencies.php b/src/Dependencies.php index d82b70a..f0b2c05 100644 --- a/src/Dependencies.php +++ b/src/Dependencies.php @@ -5,14 +5,16 @@ namespace MailAccountAdmin; use DI\Container; use MailAccountAdmin\Login\LoginController; +use PDO; use Psr\Container\ContainerInterface; use Slim\Views\Twig; class Dependencies { - private const SETTINGS = 'settings'; - private const TWIG = 'view'; + public const SETTINGS = 'settings'; + public const TWIG = 'view'; private const TWIG_TEMPLATE_DIR = __DIR__ . '/../templates'; + public const DATABASE = 'database'; public static function createContainer(Settings $settings): Container { @@ -29,6 +31,22 @@ class Dependencies return Twig::create(self::TWIG_TEMPLATE_DIR, $settings->getTwigSettings()); }); + // Database connection + $container->set(self::DATABASE, function (ContainerInterface $c) { + /** @var Settings $settings */ + $settings = $c->get(self::SETTINGS); + $dbSettings = $settings->getDatabaseSettings(); + + return new PDO( + "mysql:dbname={$dbSettings['dbname']};host={$dbSettings['host']};port={$dbSettings['port']}", + $dbSettings['username'], + $dbSettings['password'], + [ + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + ], + ); + }); + // Login, registration, authentication $container->set(LoginController::class, function (ContainerInterface $c) { return new LoginController( diff --git a/src/Middlewares.php b/src/Middlewares.php index cbadfc7..2ed0307 100644 --- a/src/Middlewares.php +++ b/src/Middlewares.php @@ -8,8 +8,11 @@ use Slim\Views\TwigMiddleware; class Middlewares { - public static function setMiddlewares(App $app): void + public static function setMiddlewares(App $app, Settings $settings): void { + $displayErrorDetails = $settings->isDebugMode(); + + $app->addErrorMiddleware($displayErrorDetails, true, true); $app->add(TwigMiddleware::createFromContainer($app)); } } diff --git a/src/Settings.php b/src/Settings.php index b36160f..af0e385 100644 --- a/src/Settings.php +++ b/src/Settings.php @@ -5,12 +5,27 @@ namespace MailAccountAdmin; class Settings { + public function isDebugMode(): bool + { + return getenv('APP_DEBUG') === 'true'; + } + public function getTwigSettings(): array { - $cacheDir = getenv('TWIG_CACHE_DIR'); - return [ - 'cache' => !empty($cacheDir) ? $cacheDir : false, + 'cache' => getenv('TWIG_CACHE_DIR') ?: false, + '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_USERNAME') ?: '', + 'password' => getenv('DB_PASSWORD') ?: '', ]; } }