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

Skip to content

Commit 9545899

Browse files
[DI] Allow definitions to inherit tags from parent context
1 parent 572db9f commit 9545899

File tree

10 files changed

+109
-25
lines changed

10 files changed

+109
-25
lines changed

src/Symfony/Component/DependencyInjection/CHANGELOG.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@ CHANGELOG
44
3.3.0
55
-----
66

7-
* Using the `PhpDumper` with an uncompiled `ContainerBuilder` is deprecated and
8-
will not be supported anymore in 4.0.
9-
7+
* added file-wide configurable defaults for service attributes "public", "tags",
8+
"autowire" and a new "inherit-tags"
9+
* made the "class" attribute optional, using the "id" as fallback
10+
* using the `PhpDumper` with an uncompiled `ContainerBuilder` is deprecated and
11+
will not be supported anymore in 4.0
1012
* deprecated the `DefinitionDecorator` class in favor of `ChildDefinition`
1113

1214
3.2.0

src/Symfony/Component/DependencyInjection/ChildDefinition.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ class_alias(ChildDefinition::class, DefinitionDecorator::class);
2424
class ChildDefinition extends Definition
2525
{
2626
private $parent;
27+
private $inheritTags = false;
2728
private $changes = array();
2829

2930
/**
@@ -56,6 +57,30 @@ public function getChanges()
5657
return $this->changes;
5758
}
5859

60+
/**
61+
* Sets whether tags should be inherited from the parent or not.
62+
*
63+
* @param bool $boolean
64+
*
65+
* @return $this
66+
*/
67+
public function setInheritTags($boolean)
68+
{
69+
$this->inheritTags = (bool) $boolean;
70+
71+
return $this;
72+
}
73+
74+
/**
75+
* Returns whether tags should be inherited from the parent or not.
76+
*
77+
* @return bool
78+
*/
79+
public function getInheritTags()
80+
{
81+
return $this->inheritTags;
82+
}
83+
5984
/**
6085
* {@inheritdoc}
6186
*/

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,15 @@ private function doResolveDefinition(ContainerBuilder $container, ChildDefinitio
213213
$def->setShared($definition->isShared());
214214
$def->setTags($definition->getTags());
215215

216+
// append parent tags when inheriting is enabled
217+
if ($definition->getInheritTags()) {
218+
foreach ($parentDef->getTags() as $k => $v) {
219+
foreach ($v as $v) {
220+
$def->addTag($k, $v);
221+
}
222+
}
223+
}
224+
216225
return $def;
217226
}
218227
}

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

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,9 @@ private function getServiceDefaults(\DOMDocument $xml, $file)
148148
if ($defaultsNode->hasAttribute('public')) {
149149
$defaults['public'] = XmlUtils::phpize($defaultsNode->getAttribute('public'));
150150
}
151+
if ($defaultsNode->hasAttribute('inherit-tags')) {
152+
$defaults['inherit-tags'] = XmlUtils::phpize($defaultsNode->getAttribute('inherit-tags'));
153+
}
151154
if (!$defaultsNode->hasAttribute('autowire')) {
152155
foreach ($defaults['autowire'] as $k => $v) {
153156
$defaults['autowire'][$k] = $v->textContent;
@@ -192,6 +195,12 @@ private function parseDefinition(\DOMElement $service, $file, array $defaults =
192195

193196
if ($parent = $service->getAttribute('parent')) {
194197
$definition = new ChildDefinition($parent);
198+
199+
if ($value = $service->getAttribute('inherit-tags')) {
200+
$definition->setInheritTags(XmlUtils::phpize($value));
201+
} elseif (isset($defaults['inherit-tags'])) {
202+
$definition->setInheritTags($defaults['inherit-tags']);
203+
}
195204
$defaults = array();
196205
} else {
197206
$definition = new Definition();
@@ -268,8 +277,15 @@ private function parseDefinition(\DOMElement $service, $file, array $defaults =
268277
}
269278

270279
$tags = $this->getChildren($service, 'tag');
271-
if (!$tags && !empty($defaults['tags'])) {
272-
$tags = $defaults['tags'];
280+
281+
if (empty($defaults['tags'])) {
282+
// no-op
283+
} elseif (!$value = $service->getAttribute('inherit-tags')) {
284+
if (!$tags) {
285+
$tags = $defaults['tags'];
286+
}
287+
} elseif (XmlUtils::phpize($value)) {
288+
$tags = array_merge($tags, $defaults['tags']);
273289
}
274290

275291
foreach ($tags as $tag) {

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

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ class YamlFileLoader extends FileLoader
5050
'configurator' => 'configurator',
5151
'calls' => 'calls',
5252
'tags' => 'tags',
53+
'inherit_tags' => 'inherit_tags',
5354
'decorates' => 'decorates',
5455
'decoration_inner_name' => 'decoration_inner_name',
5556
'decoration_priority' => 'decoration_priority',
@@ -154,7 +155,7 @@ private function parseDefinitions($content, $file)
154155
@trigger_error('Giving a service the "_defaults" name is deprecated since Symfony 3.3 and will be forbidden in 4.0. Rename your service.', E_USER_DEPRECATED);
155156
$defaults = array();
156157
} else {
157-
$defaultKeys = array('public', 'tags', 'autowire');
158+
$defaultKeys = array('public', 'tags', 'inherit_tags', 'autowire');
158159
unset($content['services']['_defaults']);
159160

160161
foreach ($defaults as $key => $default) {
@@ -238,6 +239,11 @@ private function parseDefinition($id, $service, $file, array $defaults)
238239

239240
if (isset($service['parent'])) {
240241
$definition = new ChildDefinition($service['parent']);
242+
243+
$inheritTag = isset($service['inherit_tags']) ? $service['inherit_tags'] : (isset($defaults['inherit_tags']) ? $defaults['inherit_tags'] : null);
244+
if (null !== $inheritTag) {
245+
$definition->setInheritTags($inheritTag);
246+
}
241247
$defaults = array();
242248
} else {
243249
$definition = new Definition();
@@ -310,7 +316,18 @@ private function parseDefinition($id, $service, $file, array $defaults)
310316
}
311317
}
312318

313-
$tags = isset($service['tags']) ? $service['tags'] : (isset($defaults['tags']) ? $defaults['tags'] : null);
319+
$tags = isset($service['tags']) ? $service['tags'] : array();
320+
321+
if (!isset($defaults['tags'])) {
322+
// no-op
323+
} elseif (!isset($service['inherit_tags'])) {
324+
if (!isset($service['tags'])) {
325+
$tags = $defaults['tags'];
326+
}
327+
} elseif ($service['inherit_tags']) {
328+
$tags = array_merge($tags, $defaults['tags']);
329+
}
330+
314331
if (null !== $tags) {
315332
if (!is_array($tags)) {
316333
throw new InvalidArgumentException(sprintf('Parameter "tags" must be an array for service "%s" in %s. Check your YAML syntax.', $id, $file));

src/Symfony/Component/DependencyInjection/Loader/schema/dic/services/services-1.0.xsd

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@
102102
</xsd:choice>
103103
<xsd:attribute name="public" type="boolean" />
104104
<xsd:attribute name="autowire" type="boolean" />
105+
<xsd:attribute name="inherit-tags" type="boolean" />
105106
</xsd:complexType>
106107

107108
<xsd:complexType name="service">
@@ -130,6 +131,7 @@
130131
<xsd:attribute name="decoration-inner-name" type="xsd:string" />
131132
<xsd:attribute name="decoration-priority" type="xsd:integer" />
132133
<xsd:attribute name="autowire" type="boolean" />
134+
<xsd:attribute name="inherit-tags" type="boolean" />
133135
</xsd:complexType>
134136

135137
<xsd:complexType name="tag">

src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services29.xml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,13 @@
66
</defaults>
77

88
<service id="with_defaults" class="Foo" />
9-
<service id="no_defaults" class="Foo" public="true" autowire="false">
10-
<tag name="bar" />
9+
<service id="no_defaults" class="Foo" public="true" autowire="false" inherit-tags="false">
1110
</service>
1211
<service id="no_defaults_child" class="Foo" parent="no_defaults">
1312
<tag name="bar" />
1413
</service>
15-
<service id="with_defaults_child" class="Foo" parent="with_defaults" />
14+
<service id="with_defaults_child" class="Foo" parent="with_defaults" public="true" inherit-tags="true">
15+
<tag name="baz" />
16+
</service>
1617
</services>
1718
</container>

src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services28.yml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ services:
1010

1111
with_null:
1212
class: Foo
13-
public: ~
13+
public: true
1414
autowire: ~
15-
tags: ~
15+
inherit_tags: false
1616

1717
no_defaults:
1818
class: Foo
@@ -28,3 +28,7 @@ services:
2828

2929
with_defaults_child:
3030
parent: with_defaults
31+
public: true
32+
inherit_tags: true
33+
tags:
34+
- name: baz

src/Symfony/Component/DependencyInjection/Tests/Loader/XmlFileLoaderTest.php

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -602,19 +602,23 @@ public function testDefaults()
602602
$loader->load('services29.xml');
603603

604604
$this->assertFalse($container->getDefinition('with_defaults')->isPublic());
605+
$this->assertSame(array('foo' => array(array())), $container->getDefinition('with_defaults')->getTags());
606+
$this->assertTrue($container->getDefinition('with_defaults')->isAutowired());
607+
608+
$this->assertArrayNotHasKey('public', $container->getDefinition('no_defaults_child')->getChanges());
609+
$this->assertArrayNotHasKey('autowire', $container->getDefinition('no_defaults_child')->getChanges());
610+
611+
$container->compile();
612+
605613
$this->assertTrue($container->getDefinition('no_defaults')->isPublic());
606614
$this->assertTrue($container->getDefinition('no_defaults_child')->isPublic());
607-
$this->assertArrayNotHasKey('public', $container->getDefinition('no_defaults_child')->getChanges());
608615

609-
$this->assertSame(array('foo' => array(array())), $container->getDefinition('with_defaults')->getTags());
610-
$this->assertSame(array('bar' => array(array())), $container->getDefinition('no_defaults')->getTags());
616+
$this->assertSame(array(), $container->getDefinition('no_defaults')->getTags());
611617
$this->assertSame(array('bar' => array(array())), $container->getDefinition('no_defaults_child')->getTags());
612-
$this->assertSame(array(), $container->getDefinition('with_defaults_child')->getTags());
618+
$this->assertSame(array('baz' => array(array()), 'foo' => array(array())), $container->getDefinition('with_defaults_child')->getTags());
613619

614-
$this->assertTrue($container->getDefinition('with_defaults')->isAutowired());
615620
$this->assertFalse($container->getDefinition('no_defaults')->isAutowired());
616621
$this->assertFalse($container->getDefinition('no_defaults_child')->isAutowired());
617-
$this->assertArrayNotHasKey('autowire', $container->getDefinition('no_defaults_child')->getChanges());
618622
}
619623

620624
public function testDefaultsWithAutowiredMethods()

src/Symfony/Component/DependencyInjection/Tests/Loader/YamlFileLoaderTest.php

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -336,22 +336,26 @@ public function testDefaults()
336336
$loader->load('services28.yml');
337337

338338
$this->assertFalse($container->getDefinition('with_defaults')->isPublic());
339-
$this->assertFalse($container->getDefinition('with_null')->isPublic());
339+
$this->assertSame(array('foo' => array(array())), $container->getDefinition('with_defaults')->getTags());
340+
$this->assertTrue($container->getDefinition('with_defaults')->isAutowired());
341+
342+
$this->assertArrayNotHasKey('public', $container->getDefinition('no_defaults_child')->getChanges());
343+
$this->assertArrayNotHasKey('autowire', $container->getDefinition('no_defaults_child')->getChanges());
344+
345+
$container->compile();
346+
347+
$this->assertTrue($container->getDefinition('with_null')->isPublic());
340348
$this->assertTrue($container->getDefinition('no_defaults')->isPublic());
341349
$this->assertTrue($container->getDefinition('no_defaults_child')->isPublic());
342-
$this->assertArrayNotHasKey('public', $container->getDefinition('no_defaults_child')->getChanges());
343350

344-
$this->assertSame(array('foo' => array(array())), $container->getDefinition('with_defaults')->getTags());
345-
$this->assertSame(array('foo' => array(array())), $container->getDefinition('with_null')->getTags());
351+
$this->assertSame(array(), $container->getDefinition('with_null')->getTags());
346352
$this->assertSame(array(), $container->getDefinition('no_defaults')->getTags());
347353
$this->assertSame(array('bar' => array(array())), $container->getDefinition('no_defaults_child')->getTags());
348-
$this->assertSame(array(), $container->getDefinition('with_defaults_child')->getTags());
354+
$this->assertSame(array('baz' => array(array()), 'foo' => array(array())), $container->getDefinition('with_defaults_child')->getTags());
349355

350-
$this->assertTrue($container->getDefinition('with_defaults')->isAutowired());
351356
$this->assertTrue($container->getDefinition('with_null')->isAutowired());
352357
$this->assertFalse($container->getDefinition('no_defaults')->isAutowired());
353358
$this->assertFalse($container->getDefinition('no_defaults_child')->isAutowired());
354-
$this->assertArrayNotHasKey('autowire', $container->getDefinition('no_defaults_child')->getChanges());
355359
}
356360

357361
/**

0 commit comments

Comments
 (0)