bug #37435 [DI] fix minor perf regression when creating non-shared services (nicolas-grekas)
This PR was merged into the 5.1 branch.
Discussion
----------
[DI] fix minor perf regression when creating non-shared services
| Q | A
| ------------- | ---
| Branch? | 5.1
| Bug fix? | yes
| New feature? | no
| Deprecations? | no
| Tickets | Fix #37401
| License | MIT
| Doc PR | -
This PR restores some dumped code that was too aggressively removed in #36193.
Commits
-------
75e2ee17b0
[DI] fix minor perf regression when creating non-shared services
This commit is contained in:
commit
7f0338e039
@ -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);
|
||||
|
@ -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']();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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']();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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']();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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']();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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']();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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']();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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']();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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']();
|
||||
}
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user