Skip to content

Commit 0f40c43

Browse files
Merge branch '4.4' into 5.4
* 4.4: [FrameworkBundle] fix tests [FrameworkBundle] fix wiring of annotations.cached_reader Fix BC break
2 parents 3cf2f75 + 0e49bfe commit 0f40c43

File tree

3 files changed

+35
-3
lines changed

3 files changed

+35
-3
lines changed

Compiler/DecoratorServicePass.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@ public function process(ContainerBuilder $container)
5151
}
5252
$decoratingDefinitions = [];
5353

54+
$tagsToKeep = $container->hasParameter('container.behavior_describing_tags')
55+
? $container->getParameter('container.behavior_describing_tags')
56+
: ['container.do_not_inline', 'container.service_locator', 'container.service_subscriber'];
57+
5458
foreach ($definitions as [$id, $definition]) {
5559
$decoratedService = $definition->getDecoratedService();
5660
[$inner, $renamedId] = $decoratedService;
@@ -101,8 +105,8 @@ public function process(ContainerBuilder $container)
101105
$decoratingTags = $decoratingDefinition->getTags();
102106
$resetTags = [];
103107

104-
// container.service_locator and container.service_subscriber have special logic and they must not be transferred out to decorators
105-
foreach (['container.service_locator', 'container.service_subscriber'] as $containerTag) {
108+
// Behavior-describing tags must not be transferred out to decorators
109+
foreach ($tagsToKeep as $containerTag) {
106110
if (isset($decoratingTags[$containerTag])) {
107111
$resetTags[$containerTag] = $decoratingTags[$containerTag];
108112
unset($decoratingTags[$containerTag]);

Compiler/InlineServiceDefinitionsPass.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ protected function processValue($value, bool $isRoot = false)
163163
*/
164164
private function isInlineableDefinition(string $id, Definition $definition): bool
165165
{
166-
if ($definition->hasErrors() || $definition->isDeprecated() || $definition->isLazy() || $definition->isSynthetic()) {
166+
if ($definition->hasErrors() || $definition->isDeprecated() || $definition->isLazy() || $definition->isSynthetic() || $definition->hasTag('container.do_not_inline')) {
167167
return false;
168168
}
169169

Tests/Compiler/InlineServiceDefinitionsPassTest.php

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,34 @@ public function testProcessDoesNotSetLazyArgumentValuesAfterInlining()
323323
$this->assertSame('inline', (string) $values[0]);
324324
}
325325

326+
public function testDoNotInline()
327+
{
328+
$container = new ContainerBuilder();
329+
$container->register('decorated1', 'decorated1')->addTag('container.do_not_inline');
330+
$container->register('decorated2', 'decorated2')->addTag('container.do_not_inline');
331+
$container->setAlias('alias2', 'decorated2');
332+
333+
$container
334+
->register('s1', 's1')
335+
->setDecoratedService('decorated1')
336+
->setPublic(true)
337+
->setProperties(['inner' => new Reference('s1.inner')]);
338+
339+
$container
340+
->register('s2', 's2')
341+
->setDecoratedService('alias2')
342+
->setPublic(true)
343+
->setProperties(['inner' => new Reference('s2.inner')]);
344+
345+
$container->compile();
346+
347+
$this->assertFalse($container->hasAlias('alias2'));
348+
$this->assertEquals(new Reference('decorated2'), $container->getDefinition('s2')->getProperties()['inner']);
349+
$this->assertEquals(new Reference('s1.inner'), $container->getDefinition('s1')->getProperties()['inner']);
350+
$this->assertSame('decorated2', $container->getDefinition('decorated2')->getClass());
351+
$this->assertSame('decorated1', $container->getDefinition('s1.inner')->getClass());
352+
}
353+
326354
protected function process(ContainerBuilder $container)
327355
{
328356
(new InlineServiceDefinitionsPass(new AnalyzeServiceReferencesPass()))->process($container);

0 commit comments

Comments
 (0)