You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
115 lines
2.6 KiB
PHP
115 lines
2.6 KiB
PHP
<?php
|
|
|
|
|
|
namespace CubiStore\Web;
|
|
|
|
use CubiStore\Web\Utils\ICompiledRoutes;
|
|
use CubiStore\Web\Utils\RouteCompiler;
|
|
use DI\Bridge\Slim\Bridge;
|
|
use DI\Container;
|
|
use DI\ContainerBuilder;
|
|
use Slim\App;
|
|
use function DI\autowire;
|
|
|
|
class Main
|
|
{
|
|
/**
|
|
* @var string
|
|
*/
|
|
private $env;
|
|
|
|
/**
|
|
* @var Container
|
|
*/
|
|
private $container;
|
|
|
|
/**
|
|
* @var App
|
|
*/
|
|
private $app;
|
|
|
|
private function __construct(string $env = 'prod')
|
|
{
|
|
$this->env = $env;
|
|
}
|
|
|
|
public static function main(string $env = 'prod')
|
|
{
|
|
static::make($env)->run();
|
|
}
|
|
|
|
public static function make(string $env = 'prod')
|
|
{
|
|
$_ENV['ENV'] = $env;
|
|
$main = new Main($env);
|
|
$main->setup();
|
|
return $main;
|
|
}
|
|
|
|
public function run()
|
|
{
|
|
$this->app->run();
|
|
}
|
|
|
|
public function setup()
|
|
{
|
|
$routes = $this->setupRoutes();
|
|
$this->setupContainer($routes);
|
|
$this->setupSlim($routes);
|
|
}
|
|
|
|
public function setupRoutes(): ICompiledRoutes
|
|
{
|
|
$compiledRoutesFile = __DIR__ . '/../var/cache/routes/CompiledRoutes.php';
|
|
|
|
if ($this->env !== 'prod' || !file_exists($compiledRoutesFile)) {
|
|
$routes = include(__DIR__ . '/../config/routes.php');
|
|
$compiler = new RouteCompiler($compiledRoutesFile);
|
|
$compiler->addRoutes($routes);
|
|
$compiler->writeCache();
|
|
}
|
|
|
|
include(__DIR__ . '/../var/cache/routes/CompiledRoutes.php');
|
|
$x = "\CubiStore\Web\Cache\CompiledRoutes";
|
|
return new $x();
|
|
}
|
|
|
|
public function setupContainer(ICompiledRoutes $routes)
|
|
{
|
|
$containerBuilder = new ContainerBuilder();
|
|
|
|
if ($this->env === 'prod') {
|
|
$containerBuilder->enableCompilation(__DIR__ . '/../var/cache/container');
|
|
}
|
|
|
|
$containerBuilder->addDefinitions(include(__DIR__ . '/../config/container.php'));
|
|
|
|
if ($this->env !== 'prod') {
|
|
$def = [];
|
|
foreach ($routes->getKeys() as $key) {
|
|
if (class_exists($key)) {
|
|
$def[$key] = autowire();
|
|
}
|
|
}
|
|
|
|
$containerBuilder->addDefinitions($def);
|
|
}
|
|
|
|
$this->container = $containerBuilder->build();
|
|
}
|
|
|
|
public function setupSlim(ICompiledRoutes $compiledRoutes)
|
|
{
|
|
$app = Bridge::create($this->container);
|
|
$compiledRoutes->configure($app);
|
|
$app->addRoutingMiddleware();
|
|
$app->addBodyParsingMiddleware();
|
|
$this->app = $app;
|
|
}
|
|
|
|
public function get(string $class)
|
|
{
|
|
return $this->container->get($class);
|
|
}
|
|
}
|