slovocast/app/src/Bootstrap.php

131 lines
3.4 KiB
PHP
Raw Normal View History

<?php
namespace Slovocast;
use Slim\App;
use Slim\Factory\AppFactory;
use League\Config\Configuration;
use DI\Container;
use DI\ContainerBuilder;
2024-05-16 02:03:49 +00:00
use Slim\Views\Twig;
use Slim\Views\TwigMiddleware;
use Slovocast\Routes;
use Slovocast\Configuration\SiteInformationSchema;
use Slovocast\Configuration\DatabaseConnectionSchema;
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());
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
],
]);
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 () {
$messages = [];
return new \Slim\Flash\Messages($messages);
}
]);
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.
*
* @param App $app
*/
protected static function establishMiddleware(App $app): void
{
2024-05-24 02:39:38 +00:00
/**
* @var Configuration
*/
$config = $app->getContainer()->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'));
$app->add(TwigMiddleware::create($app, $twig));
// Flash Messages
$app->add(function ($req, $next) {
if (session_status() !== PHP_SESSION_ACTIVE) {
session_start();
}
$this->get('flash')->__construct($_SESSION);
return $next->handle($req);
});
}
/**
* 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;
}
}