[DI] fix minor perf regression when creating non-shared services

This commit is contained in:
Nicolas Grekas 2020-06-27 12:33:05 +02:00
parent 5355172c10
commit 75e2ee17b0
9 changed files with 73 additions and 19 deletions

View File

@ -864,13 +864,23 @@ EOF;
}
if ($this->getProxyDumper()->isProxyCandidate($definition)) {
$factoryCode = $asFile ? "\$this->load('%s', false)" : '$this->%s(false)';
$factoryCode = $this->getProxyDumper()->getProxyFactoryCode($definition, $id, sprintf($factoryCode, $methodName));
$factoryCode = $definition->isShared() ? ($asFile ? "\$this->load('%s', false)" : '$this->%s(false)') : '$this->factories[%2$s](false)';
$factoryCode = $this->getProxyDumper()->getProxyFactoryCode($definition, $id, sprintf($factoryCode, $methodName, $this->doExport($id)));
$code .= $asFile ? preg_replace('/function \(([^)]*+)\) {/', 'function (\1) use ($container) {', $factoryCode) : $factoryCode;
}
$code .= $this->addServiceInclude($id, $definition);
$code .= $this->addInlineService($id, $definition);
$c = $this->addInlineService($id, $definition);
if (!$definition->isShared()) {
$c = implode("\n", array_map(function ($line) { return $line ? ' '.$line : $line; }, explode("\n", $c)));
$factory = sprintf('$this->factories%s[%s]', $definition->isPublic() ? '' : "['service_container']", $this->doExport($id));
$lazyloadInitialization = $definition->isLazy() ? '$lazyLoad = true' : '';
$c = sprintf(" %s = function (%s) {\n%s };\n\n return %1\$s();\n", $factory, $lazyloadInitialization, $c);
}
$code .= $c;
}
if ($asFile) {
@ -1880,10 +1890,14 @@ EOF;
$code = sprintf('$this->%s[%s] = %s', $definition->isPublic() ? 'services' : 'privates', $this->doExport($id), $code);
}
$code = "($code)";
} elseif ($this->asFiles && !$this->inlineFactories && !$this->isHotPath($definition)) {
$code = sprintf("\$this->load('%s')", $this->generateMethodName($id));
} else {
$code = sprintf('$this->%s()', $this->generateMethodName($id));
$code = $this->asFiles && !$this->inlineFactories && !$this->isHotPath($definition) ? "\$this->load('%s')" : '$this->%s()';
$code = sprintf($code, $this->generateMethodName($id));
if (!$definition->isShared()) {
$factory = sprintf('$this->factories%s[%s]', $definition->isPublic() ? '' : "['service_container']", $this->doExport($id));
$code = sprintf('(isset(%s) ? %1$s() : %s)', $factory, $code);
}
}
if ($definition->isShared() && !isset($this->singleUsePrivateIds[$id])) {
$code = sprintf('($this->%s[%s] ?? %s)', $definition->isPublic() ? 'services' : 'privates', $this->doExport($id), $code);

View File

@ -402,7 +402,11 @@ class getFooBarService extends ProjectServiceContainer
*/
public static function do($container, $lazyLoad = true)
{
return new \Bar\FooClass(($container->services['deprecated_service'] ?? $container->load('getDeprecatedServiceService')));
$container->factories['foo_bar'] = function () use ($container) {
return new \Bar\FooClass(($container->services['deprecated_service'] ?? $container->load('getDeprecatedServiceService')));
};
return $container->factories['foo_bar']();
}
}
@ -574,7 +578,11 @@ class getNonSharedFooService extends ProjectServiceContainer
{
include_once $container->targetDir.''.'/Fixtures/includes/foo.php';
return new \Bar\FooClass();
$container->factories['non_shared_foo'] = function () use ($container) {
return new \Bar\FooClass();
};
return $container->factories['non_shared_foo']();
}
}

View File

@ -275,7 +275,11 @@ class ProjectServiceContainer extends Container
*/
protected function getFooBarService()
{
return new \Bar\FooClass(($this->services['deprecated_service'] ?? $this->getDeprecatedServiceService()));
$this->factories['foo_bar'] = function () {
return new \Bar\FooClass(($this->services['deprecated_service'] ?? $this->getDeprecatedServiceService()));
};
return $this->factories['foo_bar']();
}
/**

View File

@ -300,7 +300,11 @@ class ProjectServiceContainer extends Container
*/
protected function getFooBarService()
{
return new \Bar\FooClass(($this->services['deprecated_service'] ?? $this->getDeprecatedServiceService()));
$this->factories['foo_bar'] = function () {
return new \Bar\FooClass(($this->services['deprecated_service'] ?? $this->getDeprecatedServiceService()));
};
return $this->factories['foo_bar']();
}
/**
@ -398,7 +402,11 @@ class ProjectServiceContainer extends Container
{
include_once $this->targetDir.''.'/Fixtures/includes/foo.php';
return new \Bar\FooClass();
$this->factories['non_shared_foo'] = function () {
return new \Bar\FooClass();
};
return $this->factories['non_shared_foo']();
}
/**

View File

@ -287,11 +287,15 @@ class Symfony_DI_PhpDumper_Test_Almost_Circular_Public extends Container
*/
protected function getFoo4Service()
{
$instance = new \stdClass();
$this->factories['foo4'] = function () {
$instance = new \stdClass();
$instance->foobar = ($this->services['foobar4'] ?? $this->getFoobar4Service());
$instance->foobar = ($this->services['foobar4'] ?? $this->getFoobar4Service());
return $instance;
return $instance;
};
return $this->factories['foo4']();
}
/**

View File

@ -275,7 +275,11 @@ class Symfony_DI_PhpDumper_Errored_Definition extends Container
*/
protected function getFooBarService()
{
return new \Bar\FooClass(($this->services['deprecated_service'] ?? $this->getDeprecatedServiceService()));
$this->factories['foo_bar'] = function () {
return new \Bar\FooClass(($this->services['deprecated_service'] ?? $this->getDeprecatedServiceService()));
};
return $this->factories['foo_bar']();
}
/**

View File

@ -57,7 +57,7 @@ class ProjectServiceContainer extends Container
*/
protected function getBarService()
{
return $this->services['bar'] = new \stdClass($this->getFooService());
return $this->services['bar'] = new \stdClass((isset($this->factories['service_container']['foo']) ? $this->factories['service_container']['foo']() : $this->getFooService()));
}
/**
@ -69,7 +69,11 @@ class ProjectServiceContainer extends Container
{
// lazy factory for stdClass
return new \stdClass();
$this->factories['service_container']['foo'] = function ($lazyLoad = true) {
return new \stdClass();
};
return $this->factories['service_container']['foo']();
}
}

View File

@ -30,7 +30,11 @@ class getNonSharedFooService extends ProjectServiceContainer
{
include_once $container->targetDir.''.'/Fixtures/includes/foo_lazy.php';
return new \Bar\FooLazyClass();
$container->factories['non_shared_foo'] = function ($lazyLoad = true) {
return new \Bar\FooLazyClass();
};
return $container->factories['non_shared_foo']();
}
}

View File

@ -107,7 +107,11 @@ class Symfony_DI_PhpDumper_Service_Locator_Argument extends Container
*/
protected function getFoo3Service()
{
return new \stdClass();
$this->factories['service_container']['foo3'] = function () {
return new \stdClass();
};
return $this->factories['service_container']['foo3']();
}
/**