Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 2b924b6

Browse files
[DI] Add getter injection
1 parent d614193 commit 2b924b6

16 files changed

+109
-11
lines changed

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

Lines 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

Lines 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

Lines 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

Lines 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

Lines 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

Lines 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

Lines 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

Lines 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

Lines 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

Lines 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] = $returnValue;
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

Lines 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

Lines 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

Lines 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

Lines 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

Lines 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

Lines 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)