2018-11-12 17:59:15 +01:00
|
|
|
<?php
|
2020-10-15 00:19:31 +02:00
|
|
|
|
2021-07-19 07:53:45 +02:00
|
|
|
declare(strict_types=1);
|
|
|
|
|
2018-11-12 17:59:15 +01:00
|
|
|
namespace App;
|
|
|
|
|
2021-03-11 06:58:39 +01:00
|
|
|
use App\Console\Application;
|
2022-01-07 09:26:40 +01:00
|
|
|
use App\Enums\SupportedLocales;
|
2023-12-22 23:21:10 +01:00
|
|
|
use App\Http\HttpFactory;
|
2022-06-16 23:38:03 +02:00
|
|
|
use App\Utilities\Logger as AppLogger;
|
2019-09-12 07:31:01 +02:00
|
|
|
use DI;
|
2022-05-22 09:39:00 +02:00
|
|
|
use Monolog\ErrorHandler;
|
2022-06-14 22:18:17 +02:00
|
|
|
use Monolog\Logger;
|
2020-12-20 03:17:49 +01:00
|
|
|
use Monolog\Registry;
|
2021-08-05 04:24:27 +02:00
|
|
|
use Psr\EventDispatcher\EventDispatcherInterface;
|
2020-07-08 09:03:50 +02:00
|
|
|
use Slim\App;
|
|
|
|
use Slim\Factory\ServerRequestCreatorFactory;
|
2023-06-11 04:21:00 +02:00
|
|
|
use Slim\Handlers\Strategies\RequestResponse;
|
2021-04-24 00:12:47 +02:00
|
|
|
|
2022-07-01 09:41:04 +02:00
|
|
|
final class AppFactory
|
2018-11-12 17:59:15 +01:00
|
|
|
{
|
2021-07-19 07:53:45 +02:00
|
|
|
public static function createApp(
|
2023-12-22 23:21:10 +01:00
|
|
|
array $appEnvironment = []
|
2021-07-19 07:53:45 +02:00
|
|
|
): App {
|
2023-12-22 23:21:10 +01:00
|
|
|
$environment = self::buildEnvironment($appEnvironment);
|
|
|
|
$diBuilder = self::createContainerBuilder($environment);
|
|
|
|
$di = self::buildContainer($diBuilder);
|
2021-03-11 06:58:39 +01:00
|
|
|
return self::buildAppFromContainer($di);
|
|
|
|
}
|
|
|
|
|
2021-07-19 07:53:45 +02:00
|
|
|
public static function createCli(
|
2023-12-22 23:21:10 +01:00
|
|
|
array $appEnvironment = []
|
2021-07-19 07:53:45 +02:00
|
|
|
): Application {
|
2023-12-22 23:21:10 +01:00
|
|
|
$environment = self::buildEnvironment($appEnvironment);
|
|
|
|
$diBuilder = self::createContainerBuilder($environment);
|
|
|
|
$di = self::buildContainer($diBuilder);
|
2022-01-07 09:26:40 +01:00
|
|
|
|
2023-12-23 04:38:51 +01:00
|
|
|
// Some CLI commands require the App to be injected for routing.
|
|
|
|
self::buildAppFromContainer($di);
|
|
|
|
|
2023-12-22 23:21:10 +01:00
|
|
|
SupportedLocales::createForCli($environment);
|
2021-03-11 06:58:39 +01:00
|
|
|
|
|
|
|
return $di->get(Application::class);
|
|
|
|
}
|
|
|
|
|
2023-12-22 23:21:10 +01:00
|
|
|
public static function buildAppFromContainer(
|
|
|
|
DI\Container $container,
|
|
|
|
?HttpFactory $httpFactory = null
|
|
|
|
): App {
|
|
|
|
$httpFactory ??= new HttpFactory();
|
|
|
|
|
2021-03-11 06:58:39 +01:00
|
|
|
ServerRequestCreatorFactory::setSlimHttpDecoratorsAutomaticDetection(false);
|
2023-12-22 23:21:10 +01:00
|
|
|
ServerRequestCreatorFactory::setServerRequestCreator($httpFactory);
|
2021-03-11 06:58:39 +01:00
|
|
|
|
|
|
|
$app = new App(
|
2023-12-22 23:21:10 +01:00
|
|
|
responseFactory: $httpFactory,
|
2022-05-18 03:54:44 +02:00
|
|
|
container: $container,
|
2021-03-11 06:58:39 +01:00
|
|
|
);
|
|
|
|
$container->set(App::class, $app);
|
|
|
|
|
|
|
|
$routeCollector = $app->getRouteCollector();
|
2023-06-11 04:21:00 +02:00
|
|
|
$routeCollector->setDefaultInvocationStrategy(new RequestResponse());
|
2021-03-11 06:58:39 +01:00
|
|
|
|
|
|
|
$environment = $container->get(Environment::class);
|
|
|
|
if ($environment->isProduction()) {
|
|
|
|
$routeCollector->setCacheFile($environment->getTempDirectory() . '/app_routes.cache.php');
|
|
|
|
}
|
|
|
|
|
2021-08-05 04:24:27 +02:00
|
|
|
$eventDispatcher = $container->get(EventDispatcherInterface::class);
|
2022-11-16 08:46:16 +01:00
|
|
|
$eventDispatcher->dispatch(new Event\BuildRoutes($app, $container));
|
2021-03-11 06:58:39 +01:00
|
|
|
|
|
|
|
return $app;
|
|
|
|
}
|
|
|
|
|
2023-12-22 23:21:10 +01:00
|
|
|
/**
|
|
|
|
* @return DI\ContainerBuilder<DI\Container>
|
|
|
|
*/
|
|
|
|
public static function createContainerBuilder(
|
|
|
|
Environment $environment
|
|
|
|
): DI\ContainerBuilder {
|
|
|
|
$diDefinitions = [
|
|
|
|
Environment::class => $environment,
|
|
|
|
];
|
2019-09-12 07:31:01 +02:00
|
|
|
|
2023-12-22 23:21:10 +01:00
|
|
|
Environment::setInstance($environment);
|
2019-09-12 07:31:01 +02:00
|
|
|
|
|
|
|
// Override DI definitions for settings.
|
2022-05-08 20:05:02 +02:00
|
|
|
$plugins = new Plugins($environment->getBaseDirectory() . '/plugins');
|
2018-11-12 17:59:15 +01:00
|
|
|
|
2022-05-08 20:05:02 +02:00
|
|
|
$diDefinitions[Plugins::class] = $plugins;
|
|
|
|
$diDefinitions = $plugins->registerServices($diDefinitions);
|
2018-11-12 17:59:15 +01:00
|
|
|
|
2021-03-11 06:58:39 +01:00
|
|
|
$containerBuilder = new DI\ContainerBuilder();
|
|
|
|
$containerBuilder->useAutowiring(true);
|
2023-06-06 17:39:21 +02:00
|
|
|
$containerBuilder->useAttributes(true);
|
2021-07-06 13:36:52 +02:00
|
|
|
|
2021-03-11 06:58:39 +01:00
|
|
|
if ($environment->isProduction()) {
|
|
|
|
$containerBuilder->enableCompilation($environment->getTempDirectory());
|
|
|
|
}
|
2019-09-10 04:30:05 +02:00
|
|
|
|
2021-03-11 06:58:39 +01:00
|
|
|
$containerBuilder->addDefinitions($diDefinitions);
|
2021-02-22 05:19:02 +01:00
|
|
|
|
2023-11-02 14:22:32 +01:00
|
|
|
$containerBuilder->addDefinitions(dirname(__DIR__) . '/config/services.php');
|
2021-02-22 05:19:02 +01:00
|
|
|
|
2023-12-22 23:21:10 +01:00
|
|
|
return $containerBuilder;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param DI\ContainerBuilder<DI\Container> $containerBuilder
|
|
|
|
* @return DI\Container
|
|
|
|
*/
|
|
|
|
public static function buildContainer(
|
|
|
|
DI\ContainerBuilder $containerBuilder
|
|
|
|
): DI\Container {
|
2021-03-11 06:58:39 +01:00
|
|
|
$di = $containerBuilder->build();
|
2019-09-12 07:31:01 +02:00
|
|
|
|
2022-05-22 09:39:00 +02:00
|
|
|
// Monolog setup
|
2022-06-14 22:18:17 +02:00
|
|
|
$logger = $di->get(Logger::class);
|
2022-05-22 09:39:00 +02:00
|
|
|
$errorHandler = new ErrorHandler($logger);
|
|
|
|
$errorHandler->registerFatalHandler();
|
2019-09-10 04:30:05 +02:00
|
|
|
|
2022-06-16 23:38:03 +02:00
|
|
|
Registry::addLogger($logger, AppLogger::INSTANCE_NAME, true);
|
2018-11-12 17:59:15 +01:00
|
|
|
|
2021-03-11 06:58:39 +01:00
|
|
|
return $di;
|
2018-11-12 17:59:15 +01:00
|
|
|
}
|
2019-09-10 04:30:05 +02:00
|
|
|
|
2021-07-19 07:53:45 +02:00
|
|
|
/**
|
2023-12-22 23:21:10 +01:00
|
|
|
* @param array<string, mixed> $rawEnvironment
|
2021-07-19 07:53:45 +02:00
|
|
|
*/
|
2023-12-22 23:21:10 +01:00
|
|
|
public static function buildEnvironment(array $rawEnvironment = []): Environment
|
2019-09-10 04:30:05 +02:00
|
|
|
{
|
2023-02-06 05:21:30 +01:00
|
|
|
$_ENV = getenv();
|
2023-12-22 23:21:10 +01:00
|
|
|
$rawEnvironment = array_merge(array_filter($_ENV), $rawEnvironment);
|
|
|
|
$environment = new Environment($rawEnvironment);
|
|
|
|
|
|
|
|
self::applyPhpSettings($environment);
|
2020-02-06 03:35:13 +01:00
|
|
|
|
2023-12-22 23:21:10 +01:00
|
|
|
return $environment;
|
2020-02-06 03:35:13 +01:00
|
|
|
}
|
|
|
|
|
2022-08-23 06:29:04 +02:00
|
|
|
private static function applyPhpSettings(Environment $environment): void
|
2020-02-06 03:35:13 +01:00
|
|
|
{
|
2021-12-12 16:19:45 +01:00
|
|
|
error_reporting(
|
|
|
|
$environment->isProduction()
|
|
|
|
? E_ALL & ~E_NOTICE & ~E_WARNING & ~E_STRICT & ~E_DEPRECATED
|
|
|
|
: E_ALL & ~E_NOTICE
|
|
|
|
);
|
2020-09-01 00:32:30 +02:00
|
|
|
|
2021-02-22 05:19:02 +01:00
|
|
|
$displayStartupErrors = (!$environment->isProduction() || $environment->isCli())
|
|
|
|
? '1'
|
|
|
|
: '0';
|
|
|
|
ini_set('display_startup_errors', $displayStartupErrors);
|
|
|
|
ini_set('display_errors', $displayStartupErrors);
|
|
|
|
|
2020-09-01 00:32:30 +02:00
|
|
|
ini_set('log_errors', '1');
|
2020-10-15 00:19:31 +02:00
|
|
|
ini_set(
|
|
|
|
'error_log',
|
2020-12-03 05:18:06 +01:00
|
|
|
$environment->isDocker()
|
2020-10-15 00:19:31 +02:00
|
|
|
? '/dev/stderr'
|
2020-12-03 05:18:06 +01:00
|
|
|
: $environment->getTempDirectory() . '/php_errors.log'
|
2020-10-15 00:19:31 +02:00
|
|
|
);
|
2020-02-06 03:35:13 +01:00
|
|
|
|
2023-12-04 07:48:40 +01:00
|
|
|
mb_internal_encoding('UTF-8');
|
|
|
|
ini_set('default_charset', 'utf-8');
|
|
|
|
|
2021-12-12 16:31:10 +01:00
|
|
|
if (!headers_sent()) {
|
|
|
|
ini_set('session.use_only_cookies', '1');
|
|
|
|
ini_set('session.cookie_httponly', '1');
|
|
|
|
ini_set('session.cookie_lifetime', '86400');
|
|
|
|
ini_set('session.use_strict_mode', '1');
|
|
|
|
|
|
|
|
session_cache_limiter('');
|
|
|
|
}
|
2020-10-08 01:50:30 +02:00
|
|
|
|
2021-12-12 16:31:10 +01:00
|
|
|
date_default_timezone_set('UTC');
|
2020-02-06 03:35:13 +01:00
|
|
|
}
|
2018-11-12 17:59:15 +01:00
|
|
|
}
|