Skip to content

Commit 0e0663f

Browse files
Merge branch '6.0' into 6.1
* 6.0: Fix merge [FrameworkBundle] fix tests [FrameworkBundle] fix wiring of annotations.cached_reader [SecurityBundle] Remove dead `class_exists` checks Fix BC break [DependencyInjection] Ignore unused bindings defined by attribute [ErrorHandler] update tentative types
2 parents 5ed5c0b + a56daa8 commit 0e0663f

6 files changed

+43
-10
lines changed

Compiler/DecoratorServicePass.php

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

43+
$tagsToKeep = $container->hasParameter('container.behavior_describing_tags')
44+
? $container->getParameter('container.behavior_describing_tags')
45+
: ['container.do_not_inline', 'container.service_locator', 'container.service_subscriber'];
46+
4347
foreach ($definitions as [$id, $definition]) {
4448
$decoratedService = $definition->getDecoratedService();
4549
[$inner, $renamedId] = $decoratedService;
@@ -90,8 +94,8 @@ public function process(ContainerBuilder $container)
9094
$decoratingTags = $decoratingDefinition->getTags();
9195
$resetTags = [];
9296

93-
// container.service_locator and container.service_subscriber have special logic and they must not be transferred out to decorators
94-
foreach (['container.service_locator', 'container.service_subscriber'] as $containerTag) {
97+
// Behavior-describing tags must not be transferred out to decorators
98+
foreach ($tagsToKeep as $containerTag) {
9599
if (isset($decoratingTags[$containerTag])) {
96100
$resetTags[$containerTag] = $decoratingTags[$containerTag];
97101
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(mixed $value, bool $isRoot = false): mixed
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

Compiler/RegisterAutoconfigureAttributesPass.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ private static function registerForAutoconfiguration(ContainerBuilder $container
7777
],
7878
],
7979
],
80-
$class->getFileName()
80+
$class->getFileName(),
81+
false
8182
);
8283
};
8384

Loader/YamlFileLoader.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ private function parseImports(array $content, string $file)
220220
}
221221
}
222222

223-
private function parseDefinitions(array $content, string $file)
223+
private function parseDefinitions(array $content, string $file, bool $trackBindings = true)
224224
{
225225
if (!isset($content['services'])) {
226226
return;
@@ -246,14 +246,14 @@ private function parseDefinitions(array $content, string $file)
246246
if (\is_string($service) && str_starts_with($service, '@')) {
247247
throw new InvalidArgumentException(sprintf('Type definition "%s" cannot be an alias within "_instanceof" in "%s". Check your YAML syntax.', $id, $file));
248248
}
249-
$this->parseDefinition($id, $service, $file, []);
249+
$this->parseDefinition($id, $service, $file, [], false, $trackBindings);
250250
}
251251
}
252252

253253
$this->isLoadingInstanceof = false;
254254
$defaults = $this->parseDefaults($content, $file);
255255
foreach ($content['services'] as $id => $service) {
256-
$this->parseDefinition($id, $service, $file, $defaults);
256+
$this->parseDefinition($id, $service, $file, $defaults, false, $trackBindings);
257257
}
258258
}
259259

@@ -338,7 +338,7 @@ private function isUsingShortSyntax(array $service): bool
338338
/**
339339
* @throws InvalidArgumentException When tags are invalid
340340
*/
341-
private function parseDefinition(string $id, array|string|null $service, string $file, array $defaults, bool $return = false)
341+
private function parseDefinition(string $id, array|string|null $service, string $file, array $defaults, bool $return = false, bool $trackBindings = true)
342342
{
343343
if (preg_match('/^_[a-zA-Z0-9_]*$/', $id)) {
344344
throw new InvalidArgumentException(sprintf('Service names that start with an underscore are reserved. Rename the "%s" service or define it in XML instead.', $id));
@@ -662,7 +662,7 @@ private function parseDefinition(string $id, array|string|null $service, string
662662
$bindingType = $this->isLoadingInstanceof ? BoundArgument::INSTANCEOF_BINDING : BoundArgument::SERVICE_BINDING;
663663
foreach ($bindings as $argument => $value) {
664664
if (!$value instanceof BoundArgument) {
665-
$bindings[$argument] = new BoundArgument($value, true, $bindingType, $file);
665+
$bindings[$argument] = new BoundArgument($value, $trackBindings, $bindingType, $file);
666666
}
667667
}
668668
}

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

Tests/Compiler/RegisterAutoconfigureAttributesPassTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public function testProcess()
3131

3232
(new RegisterAutoconfigureAttributesPass())->process($container);
3333

34-
$argument = new BoundArgument(1, true, BoundArgument::INSTANCEOF_BINDING, realpath(__DIR__.'/../Fixtures/AutoconfigureAttributed.php'));
34+
$argument = new BoundArgument(1, false, BoundArgument::INSTANCEOF_BINDING, realpath(__DIR__.'/../Fixtures/AutoconfigureAttributed.php'));
3535
$values = $argument->getValues();
3636
--$values[1];
3737
$argument->setValues($values);

0 commit comments

Comments
 (0)