slovocast/app/src/Bootstrap.php

159 lines
4.6 KiB
PHP
Raw Normal View History

<?php
namespace Slovocast;
use Slim\App;
use Slim\Factory\AppFactory;
2024-05-26 02:47:52 +00:00
use League\Config\Configuration;
2024-05-26 02:47:52 +00:00
use Psr\Container\ContainerInterface;
use DI\Container;
use DI\ContainerBuilder;
2024-05-26 02:47:52 +00:00
2024-05-16 02:03:49 +00:00
use Slim\Views\Twig;
use Slim\Views\TwigMiddleware;
2024-05-26 02:47:52 +00:00
2024-05-16 02:03:49 +00:00
use Slovocast\Routes;
use Slovocast\Configuration\SiteInformationSchema;
use Slovocast\Configuration\DatabaseConnectionSchema;
use Slovocast\Configuration\SessionSchema;
2024-05-26 02:47:52 +00:00
use Psr\Log\LoggerInterface;
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Level;
use Odan\Session\PhpSession;
use Odan\Session\SessionInterface;
use Odan\Session\SessionManagerInterface;
2024-05-26 02:47:52 +00:00
class Bootstrap
{
/**
* Pulls out all the configuration schemas and configuration values.
*
* @return Configuration
*/
protected static function initConfig(): Configuration
{
$config = new Configuration();
// set all configuration details
$config->addSchema('site', SiteInformationSchema::getSchema());
$config->addSchema('database', DatabaseConnectionSchema::getSchema());
$config->addSchema('session', SessionSchema::getSchema());
2024-05-24 02:39:38 +00:00
$config->merge([
'site' => [
'name' => "Slovocast",
'description' => "A no-bullshit podcast hosting platform.",
'tags' => [
'podcast', 'hosting', 'indie', 'independent', 'easy'
]
2024-05-24 02:39:38 +00:00
],
'session' => [
'name' => 'slovocast'
]
2024-05-24 02:39:38 +00:00
]);
return $config;
}
/**
* Set up the Container with all of its definitions, as well as
* initialization of configuration.
*
* @return Container
*/
protected static function initContainer(): Container
{
$containerBuilder = new ContainerBuilder();
$config = self::initConfig();
$containerBuilder->addDefinitions([
2024-05-24 02:39:38 +00:00
'config' => $config,
// more DI stuff
'flash' => function (ContainerInterface $container) {
return $container->get(SessionInterface::class)->getFlash();
2024-05-26 02:47:52 +00:00
},
LoggerInterface::class => function() {
$logger = new Logger();
$logger->pushHandler(
new StreamHandler(__DIR__ . '/var/logs', Level::Warning)
);
return $logger;
},
SessionManagerInterface::class => function (ContainerInterface $container) {
return $container->get(SessionInterface::class);
},
SessionInterface::class => function (ContainerInterface $container) {
$options = $container->get('config')->get('session');
return new PhpSession($options);
}
]);
return $containerBuilder->build();
}
/**
* Tasking the instaniated Application, sets up all the routes for the
* application.
*
* @param App $app
* @return void
*/
protected static function establishRoutes(App $app): void
{
2024-05-16 02:03:49 +00:00
Routes::init($app);
}
/**
* Taking an instantiated application, sets up all the middleware required
* for the application to run. This appends Middleware in a Global sense,
* not per-route. Per-route middleware will be set in the `establishRoutes`
* method.
*
* @param App $app
*/
protected static function establishMiddleware(App $app): void
{
/** @var ContainerInterface $container */
$container = $app->getContainer();
2024-05-24 02:39:38 +00:00
/**
* @var Configuration
*/
$config = $container->get('config');
$app->addErrorMiddleware(true, true, true);
2024-05-16 02:03:49 +00:00
// Twig
$templatePath = __DIR__ . "/../templates";
2024-05-23 00:39:33 +00:00
$templateCache = false;
$twig = Twig::create($templatePath, [ 'cache' => $templateCache ]);
2024-05-25 16:02:18 +00:00
// Add the global variables
2024-05-24 02:39:38 +00:00
$twig->getEnvironment()
->addGlobal('site_name', $config->get('site.name'));
$twig->getEnvironment()
->addGlobal('site_description', $config->get('site.description'));
$flash = $container->get(SessionInterface::class)->getFlash();
$twig->getEnvironment()
->addGlobal('flash', $flash);
$app->add(TwigMiddleware::create($app, $twig));
}
/**
* Instantiates the application.
*
* @return App
*/
public static function init(): App
{
$container = self::initContainer();
$app = AppFactory::createFromContainer($container);
self::establishMiddleware($app);
self::establishRoutes($app);
return $app;
}
}