Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 4816d13

Browse filesBrowse files
[DI] Add getter injection
1 parent d614193 commit 4816d13
Copy full SHA for 4816d13

16 files changed

+109
-11
lines changed

‎src/Symfony/Component/DependencyInjection/Compiler/AnalyzeServiceReferencesPass.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Compiler/AnalyzeServiceReferencesPass.php
+2Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ public function process(ContainerBuilder $container)
7575

7676
if (!$this->onlyConstructorArguments) {
7777
$this->processArguments($definition->getMethodCalls());
78+
$this->processArguments($definition->getOverriddenGetters());
7879
$this->processArguments($definition->getProperties());
7980
if ($definition->getConfigurator()) {
8081
$this->processArguments(array($definition->getConfigurator()));
@@ -108,6 +109,7 @@ private function processArguments(array $arguments)
108109
} elseif ($argument instanceof Definition) {
109110
$this->processArguments($argument->getArguments());
110111
$this->processArguments($argument->getMethodCalls());
112+
$this->processArguments($argument->getOverriddenGetters());
111113
$this->processArguments($argument->getProperties());
112114

113115
if (is_array($argument->getFactory())) {

‎src/Symfony/Component/DependencyInjection/Compiler/CheckExceptionOnInvalidReferenceBehaviorPass.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Compiler/CheckExceptionOnInvalidReferenceBehaviorPass.php
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ private function processDefinition(Definition $definition)
4141
{
4242
$this->processReferences($definition->getArguments());
4343
$this->processReferences($definition->getMethodCalls());
44+
$this->processReferences($definition->getOverriddenGetters());
4445
$this->processReferences($definition->getProperties());
4546
}
4647

‎src/Symfony/Component/DependencyInjection/Compiler/CheckReferenceValidityPass.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Compiler/CheckReferenceValidityPass.php
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ public function process(ContainerBuilder $container)
4747

4848
$this->validateReferences($definition->getArguments());
4949
$this->validateReferences($definition->getMethodCalls());
50+
$this->validateReferences($definition->getOverriddenGetters());
5051
$this->validateReferences($definition->getProperties());
5152
}
5253
}

‎src/Symfony/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPass.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPass.php
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ private function inlineArguments(ContainerBuilder $container, array $arguments,
8484
} elseif ($argument instanceof Definition) {
8585
$argument->setArguments($this->inlineArguments($container, $argument->getArguments()));
8686
$argument->setMethodCalls($this->inlineArguments($container, $argument->getMethodCalls()));
87+
$argument->setOverriddenGetters($this->inlineArguments($container, $argument->getOverriddenGetters()));
8788
$argument->setProperties($this->inlineArguments($container, $argument->getProperties()));
8889

8990
$configurator = $this->inlineArguments($container, array($argument->getConfigurator()));

‎src/Symfony/Component/DependencyInjection/Compiler/ReplaceAliasByActualDefinitionPass.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Compiler/ReplaceAliasByActualDefinitionPass.php
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ public function process(ContainerBuilder $container)
7676
foreach ($container->getDefinitions() as $definitionId => $definition) {
7777
$definition->setArguments($this->updateArgumentReferences($replacements, $definitionId, $definition->getArguments()));
7878
$definition->setMethodCalls($this->updateArgumentReferences($replacements, $definitionId, $definition->getMethodCalls()));
79+
$definition->setOverriddenGetters($this->updateArgumentReferences($replacements, $definitionId, $definition->getOverriddenGetters()));
7980
$definition->setProperties($this->updateArgumentReferences($replacements, $definitionId, $definition->getProperties()));
8081
$definition->setFactory($this->updateFactoryReference($replacements, $definition->getFactory()));
8182
}

‎src/Symfony/Component/DependencyInjection/Compiler/ResolveDefinitionTemplatesPass.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Compiler/ResolveDefinitionTemplatesPass.php
+7Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ private function resolveArguments(ContainerBuilder $container, array $arguments,
7272
}
7373
$argument->setArguments($this->resolveArguments($container, $argument->getArguments()));
7474
$argument->setMethodCalls($this->resolveArguments($container, $argument->getMethodCalls()));
75+
$argument->setOverriddenGetters($this->resolveArguments($container, $argument->getOverriddenGetters()));
7576
$argument->setProperties($this->resolveArguments($container, $argument->getProperties()));
7677

7778
$configurator = $this->resolveArguments($container, array($argument->getConfigurator()));
@@ -131,6 +132,7 @@ private function doResolveDefinition(ContainerBuilder $container, ChildDefinitio
131132
$def->setClass($parentDef->getClass());
132133
$def->setArguments($parentDef->getArguments());
133134
$def->setMethodCalls($parentDef->getMethodCalls());
135+
$def->setOverriddenGetters($parentDef->getOverriddenGetters());
134136
$def->setProperties($parentDef->getProperties());
135137
$def->setAutowiringTypes($parentDef->getAutowiringTypes());
136138
if ($parentDef->isDeprecated()) {
@@ -203,6 +205,11 @@ private function doResolveDefinition(ContainerBuilder $container, ChildDefinitio
203205
$def->setMethodCalls(array_merge($def->getMethodCalls(), $calls));
204206
}
205207

208+
// merge overridden getters
209+
foreach ($definition->getOverriddenGetters() as $k => $v) {
210+
$def->setOverriddenGetter($k, $v);
211+
}
212+
206213
// merge autowiring types
207214
foreach ($definition->getAutowiringTypes() as $autowiringType) {
208215
$def->addAutowiringType($autowiringType);

‎src/Symfony/Component/DependencyInjection/Compiler/ResolveInvalidReferencesPass.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Compiler/ResolveInvalidReferencesPass.php
+11Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,17 @@ public function process(ContainerBuilder $container)
5353
}
5454
$definition->setMethodCalls($calls);
5555

56+
$getters = array();
57+
foreach ($definition->getOverriddenGetters() as $name => $value) {
58+
try {
59+
$value = $this->processArguments(array($value), true);
60+
$getters[$name] = reset($value);
61+
} catch (RuntimeException $e) {
62+
// this call is simply removed
63+
}
64+
}
65+
$definition->setOverriddenGetters($getters);
66+
5667
$properties = array();
5768
foreach ($definition->getProperties() as $name => $value) {
5869
try {

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

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Compiler/ResolveParameterPlaceHoldersPass.php
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ public function process(ContainerBuilder $container)
5151
}
5252
$definition->setMethodCalls($calls);
5353

54+
$definition->setOverriddenGetters($parameterBag->resolveValue($definition->getOverriddenGetters()));
5455
$definition->setProperties($parameterBag->resolveValue($definition->getProperties()));
5556
} catch (ParameterNotFoundException $e) {
5657
$e->setSourceId($id);

‎src/Symfony/Component/DependencyInjection/Compiler/ResolveReferencesToAliasesPass.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Compiler/ResolveReferencesToAliasesPass.php
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ public function process(ContainerBuilder $container)
4141

4242
$definition->setArguments($this->processArguments($definition->getArguments()));
4343
$definition->setMethodCalls($this->processArguments($definition->getMethodCalls()));
44+
$definition->setOverriddenGetters($this->processArguments($definition->getOverriddenGetters()));
4445
$definition->setProperties($this->processArguments($definition->getProperties()));
4546
$definition->setFactory($this->processFactory($definition->getFactory()));
4647
}

‎src/Symfony/Component/DependencyInjection/Definition.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Definition.php
+21Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ class Definition
2929
private $deprecationTemplate = 'The "%service_id%" service is deprecated. You should stop using it, as it will soon be removed.';
3030
private $properties = array();
3131
private $calls = array();
32+
private $getters = array();
3233
private $configurator;
3334
private $tags = array();
3435
private $public = true;
@@ -319,6 +320,26 @@ public function getMethodCalls()
319320
return $this->calls;
320321
}
321322

323+
public function setOverriddenGetter($name, $returnValue)
324+
{
325+
if (!$name) {
326+
throw new InvalidArgumentException(sprintf('Getter name cannot be empty.'));
327+
}
328+
$this->getters[$name] = $reference;
329+
330+
return $this;
331+
}
332+
333+
public function setOverriddenGetters(array $getters)
334+
{
335+
return $this->getters;
336+
}
337+
338+
public function getOverriddenGetters()
339+
{
340+
return $this->getters;
341+
}
342+
322343
/**
323344
* Sets tags for this definition.
324345
*

‎src/Symfony/Component/DependencyInjection/Dumper/GraphvizDumper.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Dumper/GraphvizDumper.php
+7Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,13 @@ public function dump(array $options = array())
7979
$this->findEdges($id, $call[1], false, $call[0].'()')
8080
);
8181
}
82+
83+
foreach ($definition->getOverriddenGetters() as $name => $value) {
84+
$this->edges[$id] = array_merge(
85+
$this->edges[$id],
86+
$this->findEdges($id, $value, false, $name.'()')
87+
);
88+
}
8289
}
8390

8491
return $this->container->resolveEnvPlaceholders($this->startDot().$this->addNodes().$this->addEdges().$this->endDot(), '__ENV_%s__');

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

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php
+42-11Lines changed: 42 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,7 @@ private function addServiceLocalTempVariables($cId, $definition)
207207
foreach ($localDefinitions as $iDefinition) {
208208
$this->getServiceCallsFromArguments($iDefinition->getArguments(), $calls, $behavior);
209209
$this->getServiceCallsFromArguments($iDefinition->getMethodCalls(), $calls, $behavior);
210+
$this->getServiceCallsFromArguments($iDefinition->getOverriddenGetters(), $calls, $behavior);
210211
$this->getServiceCallsFromArguments($iDefinition->getProperties(), $calls, $behavior);
211212
$this->getServiceCallsFromArguments(array($iDefinition->getConfigurator()), $calls, $behavior);
212213
$this->getServiceCallsFromArguments(array($iDefinition->getFactory()), $calls, $behavior);
@@ -329,7 +330,7 @@ private function addServiceInlinedDefinitions($id, $definition)
329330
$processed->offsetSet($sDefinition);
330331

331332
$class = $this->dumpValue($sDefinition->getClass());
332-
if ($nbOccurrences->offsetGet($sDefinition) > 1 || $sDefinition->getMethodCalls() || $sDefinition->getProperties() || null !== $sDefinition->getConfigurator() || false !== strpos($class, '$')) {
333+
if ($nbOccurrences->offsetGet($sDefinition) > 1 || $sDefinition->getMethodCalls() || $sDefinition->getOverriddenGetters() || $sDefinition->getProperties() || null !== $sDefinition->getConfigurator() || false !== strpos($class, '$')) {
333334
$name = $this->getNextVariableName();
334335
$variableMap->offsetSet($sDefinition, new Variable($name));
335336

@@ -346,9 +347,10 @@ private function addServiceInlinedDefinitions($id, $definition)
346347

347348
$code .= $this->addNewInstance($sDefinition, '$'.$name, ' = ', $id);
348349

349-
if (!$this->hasReference($id, $sDefinition->getMethodCalls(), true) && !$this->hasReference($id, $sDefinition->getProperties(), true)) {
350+
if (!$this->hasReference($id, $sDefinition->getMethodCalls(), true) && !$this->hasReference($id, $sDefinition->getOverriddenGetters(), true) && !$this->hasReference($id, $sDefinition->getProperties(), true)) {
350351
$code .= $this->addServiceProperties(null, $sDefinition, $name);
351352
$code .= $this->addServiceMethodCalls(null, $sDefinition, $name);
353+
$code .= $this->addServiceOverriddenGetters(null, $sDefinition, $name);
352354
$code .= $this->addServiceConfigurator(null, $sDefinition, $name);
353355
}
354356

@@ -438,11 +440,11 @@ private function addServiceInstance($id, Definition $definition)
438440
private function isSimpleInstance($id, Definition $definition)
439441
{
440442
foreach (array_merge(array($definition), $this->getInlinedDefinitions($definition)) as $sDefinition) {
441-
if ($definition !== $sDefinition && !$this->hasReference($id, $sDefinition->getMethodCalls())) {
443+
if ($definition !== $sDefinition && !$this->hasReference($id, $sDefinition->getMethodCalls()) && !$this->hasReference($id, $sDefinition->getOverriddenGetters())) {
442444
continue;
443445
}
444446

445-
if ($sDefinition->getMethodCalls() || $sDefinition->getProperties() || $sDefinition->getConfigurator()) {
447+
if ($sDefinition->getMethodCalls() || $sDefinition->getOverriddenGetters() || $sDefinition->getProperties() || $sDefinition->getConfigurator()) {
446448
return false;
447449
}
448450
}
@@ -474,6 +476,30 @@ private function addServiceMethodCalls($id, Definition $definition, $variableNam
474476
return $calls;
475477
}
476478

479+
/**
480+
* Adds method calls to a service definition.
481+
*
482+
* @param string $id
483+
* @param Definition $definition
484+
* @param string $variableName
485+
*
486+
* @return string
487+
*/
488+
private function addServiceOverriddenGetters($id, Definition $definition, $variableName = 'instance')
489+
{
490+
$getters = '';
491+
foreach ($definition->getOverriddenGetters() as $name => $returnValue) {
492+
$getters .= sprintf(" /**\n * {@inheritdoc}\n */\n %s function %s()%s\n {\n", 'public', $name, '');
493+
$getters .= $this->wrapServiceConditionals($returnValue, sprintf(" return %s;\n", $this->dumpValue($returnValue)), $isUnconditional);
494+
if (!$isUnconditional) {
495+
$getters .= sprintf(" return parent::%s();\n", $name);
496+
}
497+
$getters .= " }\n";
498+
}
499+
500+
return $getters;
501+
}
502+
477503
private function addServiceProperties($id, Definition $definition, $variableName = 'instance')
478504
{
479505
$code = '';
@@ -506,7 +532,7 @@ private function addServiceInlinedDefinitionsSetup($id, Definition $definition)
506532
}
507533
$processed->offsetSet($iDefinition);
508534

509-
if (!$this->hasReference($id, $iDefinition->getMethodCalls(), true) && !$this->hasReference($id, $iDefinition->getProperties(), true)) {
535+
if (!$this->hasReference($id, $iDefinition->getMethodCalls(), true) && !$this->hasReference($id, $iDefinition->getOverriddenGetters(), true) && !$this->hasReference($id, $iDefinition->getProperties(), true)) {
510536
continue;
511537
}
512538

@@ -519,6 +545,7 @@ private function addServiceInlinedDefinitionsSetup($id, Definition $definition)
519545
$name = (string) $this->definitionVariables->offsetGet($iDefinition);
520546
$code .= $this->addServiceProperties(null, $iDefinition, $name);
521547
$code .= $this->addServiceMethodCalls(null, $iDefinition, $name);
548+
$code .= $this->addServiceOverriddenGetters(null, $iDefinition, $name);
522549
$code .= $this->addServiceConfigurator(null, $iDefinition, $name);
523550
}
524551

@@ -680,6 +707,7 @@ private function addService($id, Definition $definition)
680707
$this->addServiceInlinedDefinitionsSetup($id, $definition).
681708
$this->addServiceProperties($id, $definition).
682709
$this->addServiceMethodCalls($id, $definition).
710+
$this->addServiceOverriddenGetters($id, $definition).
683711
$this->addServiceConfigurator($id, $definition).
684712
$this->addServiceReturn($id, $definition)
685713
;
@@ -1183,12 +1211,13 @@ private function endClass()
11831211
*
11841212
* @param string $value
11851213
* @param string $code
1214+
* @param bool $isUnconditional
11861215
*
11871216
* @return string
11881217
*/
1189-
private function wrapServiceConditionals($value, $code)
1218+
private function wrapServiceConditionals($value, $code, &$isUnconditional = null)
11901219
{
1191-
if (!$services = ContainerBuilder::getServiceConditionals($value)) {
1220+
if ($isUnconditional = !$services = ContainerBuilder::getServiceConditionals($value)) {
11921221
return $code;
11931222
}
11941223

@@ -1245,6 +1274,7 @@ private function getInlinedDefinitions(Definition $definition)
12451274
$definitions = array_merge(
12461275
$this->getDefinitionsFromArguments($definition->getArguments()),
12471276
$this->getDefinitionsFromArguments($definition->getMethodCalls()),
1277+
$this->getDefinitionsFromArguments($definition->getOverriddenGetters()),
12481278
$this->getDefinitionsFromArguments($definition->getProperties()),
12491279
$this->getDefinitionsFromArguments(array($definition->getConfigurator())),
12501280
$this->getDefinitionsFromArguments(array($definition->getFactory()))
@@ -1317,9 +1347,7 @@ private function hasReference($id, array $arguments, $deep = false, array &$visi
13171347
continue;
13181348
}
13191349

1320-
$arguments = array_merge($service->getMethodCalls(), $service->getArguments(), $service->getProperties());
1321-
1322-
if ($this->hasReference($id, $arguments, $deep, $visited)) {
1350+
if ($this->hasReference($id, $service->getMethodCalls(), $deep, $visited) || $this->hasReference($id, $service->getArguments(), $deep, $visited) || $this->hasReference($id, $service->getProperties(), $deep, $visited)) {
13231351
return true;
13241352
}
13251353
}
@@ -1352,9 +1380,12 @@ private function dumpValue($value, $interpolate = true)
13521380
if (null !== $this->definitionVariables && $this->definitionVariables->contains($value)) {
13531381
return $this->dumpValue($this->definitionVariables->offsetGet($value), $interpolate);
13541382
}
1355-
if (count($value->getMethodCalls()) > 0) {
1383+
if ($value->getMethodCalls()) {
13561384
throw new RuntimeException('Cannot dump definitions which have method calls.');
13571385
}
1386+
if ($value->getOverriddenGetters()) {
1387+
throw new RuntimeException('Cannot dump definitions which have overridden getters.');
1388+
}
13581389
if (null !== $value->getConfigurator()) {
13591390
throw new RuntimeException('Cannot dump definitions which have a configurator.');
13601391
}

‎src/Symfony/Component/DependencyInjection/Dumper/XmlDumper.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Dumper/XmlDumper.php
+4Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,10 @@ private function addService($definition, $id, \DOMElement $parent)
165165
$this->convertParameters($parameters, 'property', $service, 'name');
166166
}
167167

168+
if ($parameters = $definition->getOverriddenGetters()) {
169+
$this->convertParameters($parameters, 'getter', $service, 'name');
170+
}
171+
168172
$this->addMethodCalls($definition->getMethodCalls(), $service);
169173

170174
if ($callable = $definition->getFactory()) {

‎src/Symfony/Component/DependencyInjection/Dumper/YamlDumper.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Dumper/YamlDumper.php
+4Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,10 @@ private function addService($id, $definition)
124124
$code .= sprintf(" properties: %s\n", $this->dumper->dump($this->dumpValue($definition->getProperties()), 0));
125125
}
126126

127+
if ($definition->getOverriddenGetters()) {
128+
$code .= sprintf(" getters:\n%s\n", $this->dumper->dump($this->dumpValue($definition->getOverriddenGetters()), 0));
129+
}
130+
127131
if ($definition->getMethodCalls()) {
128132
$code .= sprintf(" calls:\n%s\n", $this->dumper->dump($this->dumpValue($definition->getMethodCalls()), 1, 12));
129133
}

‎src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ private function parseDefinition(\DOMElement $service, $file)
171171

172172
$definition->setArguments($this->getArgumentsAsPhp($service, 'argument'));
173173
$definition->setProperties($this->getArgumentsAsPhp($service, 'property'));
174+
$definition->setOverriddenGetters($this->getArgumentsAsPhp($service, 'getter'));
174175

175176
if ($factories = $this->getChildren($service, 'factory')) {
176177
$factory = $factories[0];

‎src/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php
+4Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,10 @@ private function parseDefinition($id, $service, $file)
242242
$definition->setConfigurator($this->parseCallable($service['configurator'], 'configurator', $id, $file));
243243
}
244244

245+
if (isset($service['getters'])) {
246+
$definition->setProperties($this->resolveServices($service['getters']));
247+
}
248+
245249
if (isset($service['calls'])) {
246250
if (!is_array($service['calls'])) {
247251
throw new InvalidArgumentException(sprintf('Parameter "calls" must be an array for service "%s" in %s. Check your YAML syntax.', $id, $file));

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.