Files
pinecore/src/ContainerFactory.php
2026-04-12 01:50:07 +03:00

58 lines
1.7 KiB
PHP

<?php
namespace Pronchev\Pinecore;
use DI\Container;
use DI\ContainerBuilder;
use Pronchev\Pinecore\Http\Router;
use Pronchev\Pinecore\Log\CompositeLogger;
use Pronchev\Pinecore\Log\FileLogger;
use Pronchev\Pinecore\Log\StdoutLogger;
use Psr\Log\LoggerInterface;
class ContainerFactory
{
public static function build(Environment $env, Config $config, string $basePath): Container
{
$builder = new ContainerBuilder();
if ($env->isProd()) {
$cacheDir = $basePath . '/var/cache/prod';
if (!is_dir($cacheDir)) {
mkdir($cacheDir, 0755, true);
}
$builder->enableCompilation($cacheDir);
}
$builder->useAttributes(true);
$builder->addDefinitions([
Config::class => $config,
Environment::class => $env,
LoggerInterface::class => function ($c) use ($config) {
$loggers = [$c->get(StdoutLogger::class)];
if ($config->get('log.file')) {
$loggers[] = $c->get(FileLogger::class);
}
return new CompositeLogger($loggers);
},
]);
$routesFile = $basePath . '/config/routes.php';
if (file_exists($routesFile)) {
$routes = require $routesFile;
$builder->addDefinitions([
Router::class => fn() => new Router($routes),
]);
}
$servicesFile = $basePath . '/config/services.php';
if (file_exists($servicesFile)) {
$definitions = require $servicesFile;
$definitions($builder, $config, $basePath);
}
return $builder->build();
}
}