8000 feature #23143 [DI] Reference instead of inline for array-params (nic… · symfony/symfony@a03e194 · GitHub
[go: up one dir, main page]

Skip to content

Commit a03e194

Browse files
committed
feature #23143 [DI] Reference instead of inline for array-params (nicolas-grekas)
This PR was merged into the 3.4 branch. Discussion ---------- [DI] Reference instead of inline for array-params | Q | A | ------------- | --- | Branch? | 3.4 | Bug fix? | no | New feature? | yes | BC breaks? | no | Deprecations? | no | Tests pass? | yes | Fixed tickets | - | License | MIT | Doc PR | - - [x] Tests to be written. This PR is part of my "container on a diet" quest. When big array parameters are resolved, they create data duplication in the dumped container. This is even worse when the same big array parameters are used several times. Even though OPcache stores static arrays in shared memory (php7), it does not deduplicate them (it does for strings.) Instead of inlining arrays, this PR leverages the `$this->parameters` property when possible. Commits ------- 7c3d0c7 [DI] Reference instead of inline for array-params
2 parents 2fe6e69 + 7c3d0c7 commit a03e194

File tree

10 files changed

+252
-28
lines changed

10 files changed

+252
-28
lines changed

src/Symfony/Component/DependencyInjection/Compiler/PassConfig.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public function __construct()
5151
new ResolveDefinitionTemplatesPass(),
5252
new ServiceLocatorTagPass(),
5353
new DecoratorServicePass(),
54-
new ResolveParameterPlaceHoldersPass(),
54+
new ResolveParameterPlaceHoldersPass(false),
5555
new ResolveFactoryClassPass(),
5656
new FactoryReturnTypePass($resolveClassPass),
5757
new CheckDefinitionValidityPass(),

src/Symfony/Component/DependencyInjection/Compiler/ResolveParameterPlaceHoldersPass.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@
2323
class ResolveParameterPlaceHoldersPass extends AbstractRecursivePass
2424
{
2525
private $bag;
26+
private $resolveArrays;
27+
28+
public function __construct($resolveArrays = true)
29+
{
30+
$this->resolveArrays = $resolveArrays;
31+
}
2632

2733
/**
2834
* {@inheritdoc}
@@ -55,7 +61,9 @@ public function process(ContainerBuilder $container)
5561
protected function processValue($value, $isRoot = false)
5662
{
5763
if (is_string($value)) {
58-
return $this->bag->resolveValue($value);
64+
$v = $this->bag->resolveValue($value);
65+
66+
return $this->resolveArrays || !$v || !is_array($v) ? $v : $value;
5967
}
6068
if ($value instanceof Definition) {
6169
$changes = $value->getChanges();

src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1061,10 +1061,12 @@ private function addDefaultParametersMethod()
10611061
*/
10621062
public function getParameter($name)
10631063
{
1064-
$name = strtolower($name);
1064+
if (!(isset($this->parameters[$name]) || isset($this->loadedDynamicParameters[$name]) || array_key_exists($name, $this->parameters))) {
1065+
$name = strtolower($name);
10651066
1066-
if (!(isset($this->parameters[$name]) || array_key_exists($name, $this->parameters) || isset($this->loadedDynamicParameters[$name]))) {
1067-
throw new InvalidArgumentException(sprintf('The parameter "%s" must be defined.', $name));
1067+
if (!(isset($this->parameters[$name]) || isset($this->loadedDynamicParameters[$name]) || array_key_exists($name, $this->parameters))) {
1068+
throw new InvalidArgumentException(sprintf('The parameter "%s" must be defined.', $name));
1069+
}
10681070
}
10691071
if (isset($this->loadedDynamicParameters[$name])) {
10701072
return $this->loadedDynamicParameters[$name] ? $this->dynamicParameters[$name] : $this->getDynamicParameter($name);
@@ -1080,7 +1082,7 @@ public function hasParameter($name)
10801082
{
10811083
$name = strtolower($name);
10821084
1083-
return isset($this->parameters[$name]) || array_key_exists($name, $this->parameters) || isset($this->loadedDynamicParameters[$name]);
1085+
return isset($this->parameters[$name]) || isset($this->loadedDynamicParameters[$name]) || array_key_exists($name, $this->parameters);
10841086
}
10851087
10861088
/**
@@ -1580,11 +1582,22 @@ private function dumpLiteralClass($class)
15801582
*/
15811583
private function dumpParameter($name)
15821584
{
1585+
$name = strtolower($name);
1586+
15831587
if ($this->container->isCompiled() && $this->container->hasParameter($name)) {
1584-
return $this->dumpValue($this->container->getParameter($name), false);
1588+
$value = $this->container->getParameter($name);< F438 /div>
1589+
$dumpedValue = $this->dumpValue($value, false);
1590+
1591+
if (!$value || !is_array($value)) {
1592+
return $dumpedValue;
1593+
}
1594+
1595+
if (!preg_match("/\\\$this->(?:getEnv\('\w++'\)|targetDirs\[\d++\])/", $dumpedValue)) {
1596+
return sprintf("\$this->parameters['%s']", $name);
1597+
}
15851598
}
15861599

1587-
return sprintf("\$this->getParameter('%s')", strtolower($name));
1600+
return sprintf("\$this->getParameter('%s')", $name);
15881601
}
15891602

15901603
/**

src/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -584,4 +584,18 @@ public function testPrivateWithIgnoreOnInvalidReference()
584584
$container = new \Symfony_DI_PhpDumper_Test_Private_With_Ignore_On_Invalid_Reference();
585585
$this->assertInstanceOf('BazClass', $container->get('bar')->getBaz());
586586
}
587+
588+
public function testArrayParameters()
589+
{
590+
$container = new ContainerBuilder();
591+
$container->setParameter('array_1', array(123));
592+
$container->setParameter('array_2', array(__DIR__));
593+
$container->register('bar', 'BarClass')
594+
->addMethodCall('setBaz', array('%array_1%', '%array_2%', '%%array_1%%'));
595+
$container->compile();
596+
597+
$dumper = new PhpDumper($container);
598+
599+
$this->assertStringEqualsFile(self::$fixturesPath.'/php/services_array_params.php', str_replace('\\\\Dumper', '/Dumper', $dumper->dump(array('file' => self::$fixturesPath.'/php/services_array_params.php'))));
600+
}
587601
}

src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services10.php

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,12 @@ protected function getTestService()
8080
*/
8181
public function getParameter($name)
8282
{
83-
$name = strtolower($name);
83+
if (!(isset($this->parameters[$name]) || isset($this->loadedDynamicParameters[$name]) || array_key_exists($name, $this->parameters))) {
84+
$name = strtolower($name);
8485

85-
if (!(isset($this->parameters[$name]) || array_key_exists($name, $this->parameters) || isset($this->loadedDynamicParameters[$name]))) {
86-
throw new InvalidArgumentException(sprintf('The parameter "%s" must be defined.', $name));
86+
if (!(isset($this->parameters[$name]) || isset($this->loadedDynamicParameters[$name]) || array_key_exists($name, $this->parameters))) {
87+
throw new InvalidArgumentException(sprintf('The parameter "%s" must be defined.', $name));
88+
}
8789
}
8890
if (isset($this->loadedDynamicParameters[$name])) {
8991
return $this->loadedDynamicParameters[$name] ? $this->dynamicParameters[$name] : $this->getDynamicParameter($name);
@@ -99,7 +101,7 @@ public function hasParameter($name)
99101
{
100102
$name = strtolower($name);
101103

102-
return isset($this->parameters[$name]) || array_key_exists($name, $this->parameters) || isset($this->loadedDynamicParameters[$name]);
104+
return isset($this->parameters[$name]) || isset($this->loadedDynamicParameters[$name]) || array_key_exists($name, $this->parameters);
103105
}
104106

105107
/**

src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services12.php

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,12 @@ protected function getTestService()
8484
*/
8585
public function getParameter($name)
8686
{
87-
$name = strtolower($name);
87+
if (!(isset($this->parameters[$name]) || isset($this->loadedDynamicParameters[$name]) || array_key_exists($name, $this->parameters))) {
88+
$name = strtolower($name);
8889

89-
if (!(isset($this->parameters[$name]) || array_key_exists($name, $this->parameters) || isset($this->loadedDynamicParameters[$name]))) {
90-
throw new InvalidArgumentException(sprintf('The parameter "%s" must be defined.', $name));
90+
if (!(isset($this->parameters[$name]) || isset($this->loadedDynamicParameters[$name]) || array_key_exists($name, $this->parameters))) {
91+
throw new InvalidArgumentException(sprintf('The parameter "%s" must be defined.', $name));
92+
}
9193
}
9294
if (isset($this->loadedDynamicParameters[$name])) {
9395
return $this->loadedDynamicParameters[$name] ? $this->dynamicParameters[$name] : $this->getDynamicParameter($name);
@@ -103,7 +105,7 @@ public function hasParameter($name)
103105
{
104106
$name = strtolower($name);
105107

106-
return isset($this->parameters[$name]) || array_key_exists($name, $this->parameters) || isset($this->loadedDynamicParameters[$name]);
108+
return isset($this->parameters[$name]) || isset($this->loadedDynamicParameters[$name]) || array_key_exists($name, $this->parameters);
107109
}
108110

109111
/**

src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services26.php

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,10 +82,12 @@ protected function getTestService()
8282
*/
8383
public function getParameter($name)
8484
{
85-
$name = strtolower($name);
85+
if (!(isset($this->parameters[$name]) || isset($this->loadedDynamicParameters[$name]) || array_key_exists($name, $this->parameters))) {
86+
$name = strtolower($name);
8687

87-
if (!(isset($this->parameters[$name]) || array_key_exists($name, $this->parameters) || isset($this->loadedDynamicParameters[$name]))) {
88-
throw new InvalidArgumentException(sprintf('The parameter "%s" must be defined.', $name));
88+
if (!(isset($this->parameters[$name]) || isset($this->loadedDynamicParameters[$name]) || array_key_exists($name, $this->parameters))) {
89+
throw new InvalidArgumentException(sprintf('The parameter "%s" must be defined.', $name));
90+
}
8991
}
9092
if (isset($this->loadedDynamicParameters[$name])) {
9193
return $this->loadedDynamicParameters[$name] ? $this->dynamicParameters[$name] : $this->getDynamicParameter($name);
@@ -101,7 +103,7 @@ public function hasParameter($name)
101103
{
102104
$name = strtolower($name);
103105

104-
return isset($this->parameters[$name]) || array_key_exists($name, $this->parameters) || isset($this->loadedDynamicParameters[$name]);
106+
return isset($this->parameters[$name]) || isset($this->loadedDynamicParameters[$name]) || array_key_exists($name, $this->parameters);
105107
}
106108

107109
/**

src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services8.php

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,12 @@ public function isFrozen()
6464
*/
6565
public function getParameter($name)
6666
{
67-
$name = strtolower($name);
67+
if (!(isset($this->parameters[$name]) || isset($this->loadedDynamicParameters[$name]) || array_key_exists($name, $this->parameters))) {
68+
$name = strtolower($name);
6869

69-
if (!(isset($this->parameters[$name]) || array_key_exists($name, $this->parameters) || isset($this->loadedDynamicParameters[$name]))) {
70-
throw new InvalidArgumentException(sprintf('The parameter "%s" must be defined.', $name));
70+
if (!(isset($this->parameters[$name]) || isset($this->loadedDynamicParameters[$name]) || array_key_exists($name, $this->parameters))) {
71+
throw new InvalidArgumentException(sprintf('The parameter "%s" must be defined.', $name));
72+
}
7173
}
7274
if (isset($this->loadedDynamicParameters[$name])) {
7375
return $this->loadedDynamicParameters[$name] ? $this->dynamicParameters[$name] : $this->getDynamicParameter($name);
@@ -83,7 +85,7 @@ public function hasParameter($name)
8385
{
8486
$name = strtolower($name);
8587

86-
return isset($this->parameters[$name]) || array_key_exists($name, $this->parameters) || isset($this->loadedDynamicParameters[$name]);
88+
return isset($this->parameters[$name]) || isset($this->loadedDynamicParameters[$name]) || array_key_exists($name, $this->parameters);
8789
}
8890

8991
/**

src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9_compiled.php

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -391,10 +391,12 @@ protected function getServiceFromStaticMethodService()
391391
*/
392392
public function getParameter($name)
393393
{
394-
$name = strtolower($name);
394+
if (!(isset($this->parameters[$name]) || isset($this->loadedDynamicParameters[$name]) || array_key_exists($name, $this->parameters))) {
395+
$name = strtolower($name);
395396

396-
if (!(isset($this->parameters[$name]) || array_key_exists($name, $this->parameters) || isset($this->loadedDynamicParameters[$name]))) {
397-
throw new InvalidArgumentException(sprintf('The parameter "%s" must be defined.', $name));
397+
if (!(isset($this->parameters[$name]) || isset($this->loadedDynamicParameters[$name]) || array_key_exists($name, $this->parameters))) {
398+
throw new InvalidArgumentException(sprintf('The parameter "%s" must be defined.', $name));
399+
}
398400
}
399401
if (isset($this->loadedDynamicParameters[$name])) {
400402
return $this->loadedDynamicParameters[$name] ? $this->dynamicParameters[$name] : $this->getDynamicParameter($name);
@@ -410,7 +412,7 @@ public function hasParameter($name)
410412
{
411413
$name = strtolower($name);
412414

413-
return isset($this->parameters[$name]) || array_key_exists($name, $this->parameters) || isset($this->loadedDynamicParameters[$name]);
415+
return isset($this->parameters[$name]) || isset($this->loadedDynamicParameters[$name]) || array_key_exists($name, $this->parameters);
414416
}
415417

416418
/**

0 commit comments

Comments
 (0)
0