Skip to content
Snippets Groups Projects
Commit d7f177b8 authored by Jan Tvrdik's avatar Jan Tvrdik
Browse files

init

parents
No related branches found
No related tags found
No related merge requests found
<?php declare(strict_types = 1);
namespace Mangoweb\NetteDIScope;
use Nette;
abstract class ScopeExtension extends Nette\DI\CompilerExtension
{
/** @var string */
private $innerContainerClassName;
/** @var string */
private $innerContainerPath;
abstract public static function getTagName(): string;
public function loadConfiguration(): void
{
parent::loadConfiguration();
$builder = $this->getContainerBuilder();
$innerContainer = $this->createInnerConfigurator()->createContainer();
$innerContainerReflection = new \ReflectionClass($innerContainer);
$this->innerContainerClassName = $innerContainerReflection->getName();
$this->innerContainerPath = $innerContainerReflection->getFileName();
$innerContainerDefinition = $builder->addDefinition($this->prefix('container'));
$innerContainerDefinition->setType(Nette\DI\Container::class);
$innerContainerDefinition->setAutowired(false);
foreach ($innerContainer->findByTag(static::getTagName()) as $serviceName => $tagAttributes) {
$serviceDef = $builder->addDefinition($this->prefix($serviceName));
$serviceDef->setType($innerContainer->getServiceType($serviceName));
$serviceDef->setFactory([$innerContainerDefinition, 'getService'], [$serviceName]);
}
}
public function afterCompile(Nette\PhpGenerator\ClassType $class): void
{
parent::afterCompile($class);
$code = implode("\n", [
"if (!class_exists({$this->innerContainerClassName}::class, false)) {",
"\trequire ?;",
'}',
'',
"\$service = new {$this->innerContainerClassName};",
'$service->addService(\'outerContainer\', $this);',
'return $service;',
]);
$createInnerContainerMethod = $class->getMethod(Nette\DI\Container::getMethodName($this->prefix('container')));
$createInnerContainerMethod->setBody($code, [$this->innerContainerPath]);
}
protected function createInnerConfigurator(): Nette\Configurator
{
$configurator = new Nette\Configurator;
$configurator->defaultExtensions = [
'extensions' => Nette\DI\Extensions\ExtensionsExtension::class,
];
$configurator->onCompile[] = function (Nette\Configurator $configurator, Nette\DI\Compiler $compiler): void {
$compiler->getContainerBuilder()->addDefinition('outerContainer')
->setType(Nette\DI\Container::class)
->setAutowired(false)
->setDynamic(true);
};
$parameters = $this->getContainerBuilder()->parameters;
$configurator->addParameters([
'appDir' => $parameters['appDir'],
'wwwDir' => $parameters['wwwDir'],
'debugMode' => $parameters['debugMode'],
'productionMode' => $parameters['productionMode'],
'consoleMode' => $parameters['consoleMode'],
]);
$configurator->setTempDirectory($parameters['tempDir']);
$configurator->addParameters($this->config);
return $configurator;
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment