Add MariaDB container; add PDO connection; add error middleware

This commit is contained in:
Lexi / Zoe 2021-07-26 23:14:14 +02:00
parent 114a67dbe4
commit 2bb7ea54a2
Signed by: binaryDiv
GPG Key ID: F8D4956E224DA232
6 changed files with 76 additions and 9 deletions

View File

@ -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

View File

@ -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:

View File

@ -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();

View File

@ -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(

View File

@ -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));
}
}

View File

@ -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') ?: '',
];
}
}