diff --git a/src/Symfony/Bundle/FrameworkBundle/Command/ContainerLintCommand.php b/src/Symfony/Bundle/FrameworkBundle/Command/ContainerLintCommand.php
index af08235512e33..0d71e6985e206 100644
--- a/src/Symfony/Bundle/FrameworkBundle/Command/ContainerLintCommand.php
+++ b/src/Symfony/Bundle/FrameworkBundle/Command/ContainerLintCommand.php
@@ -88,8 +88,6 @@ private function getContainerBuilder(): ContainerBuilder
return $this->buildContainer();
}, $kernel, $kernel::class);
$container = $buildContainer();
-
- $skippedIds = [];
} else {
if (!$kernelContainer instanceof Container) {
throw new RuntimeException(sprintf('This command does not support the application container: "%s" does not extend "%s".', get_debug_type($kernelContainer), Container::class));
@@ -100,13 +98,6 @@ private function getContainerBuilder(): ContainerBuilder
$refl = new \ReflectionProperty($parameterBag, 'resolved');
$refl->setValue($parameterBag, true);
- $skippedIds = [];
- foreach ($container->getServiceIds() as $serviceId) {
- if (str_starts_with($serviceId, '.errored.')) {
- $skippedIds[$serviceId] = true;
- }
- }
-
$container->getCompilerPassConfig()->setBeforeOptimizationPasses([]);
$container->getCompilerPassConfig()->setOptimizationPasses([]);
$container->getCompilerPassConfig()->setBeforeRemovingPasses([]);
@@ -115,7 +106,7 @@ private function getContainerBuilder(): ContainerBuilder
$container->setParameter('container.build_hash', 'lint_container');
$container->setParameter('container.build_id', 'lint_container');
- $container->addCompilerPass(new CheckTypeDeclarationsPass(true, $skippedIds), PassConfig::TYPE_AFTER_REMOVING, -100);
+ $container->addCompilerPass(new CheckTypeDeclarationsPass(true), PassConfig::TYPE_AFTER_REMOVING, -100);
return $this->containerBuilder = $container;
}
diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php
index 668f2be322411..96fe487b5426e 100644
--- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php
+++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php
@@ -375,13 +375,12 @@ public function load(array $configs, ContainerBuilder $container)
$this->registerSerializerConfiguration($config['serializer'], $container, $loader);
} else {
- $container->register('.argument_resolver.request_payload.no_serializer', Serializer::class)
+ $container->getDefinition('argument_resolver.request_payload')
+ ->setArguments([])
->addError('You can neither use "#[MapRequestPayload]" nor "#[MapQueryString]" since the Serializer component is not '
.(class_exists(Serializer::class) ? 'enabled. Try setting "framework.serializer" to true.' : 'installed. Try running "composer require symfony/serializer-pack".')
- );
-
- $container->getDefinition('argument_resolver.request_payload')
- ->replaceArgument(0, new Reference('.argument_resolver.request_payload.no_serializer', ContainerInterface::RUNTIME_EXCEPTION_ON_INVALID_REFERENCE))
+ )
+ ->addTag('container.error')
->clearTag('kernel.event_subscriber');
$container->removeDefinition('console.command.serializer_debug');
diff --git a/src/Symfony/Bundle/FrameworkBundle/composer.json b/src/Symfony/Bundle/FrameworkBundle/composer.json
index eb3d340a71b96..572353b5d7efd 100644
--- a/src/Symfony/Bundle/FrameworkBundle/composer.json
+++ b/src/Symfony/Bundle/FrameworkBundle/composer.json
@@ -21,7 +21,7 @@
"ext-xml": "*",
"symfony/cache": "^5.4|^6.0",
"symfony/config": "^6.1",
- "symfony/dependency-injection": "^6.2.8",
+ "symfony/dependency-injection": "^6.3",
"symfony/deprecation-contracts": "^2.5|^3",
"symfony/error-handler": "^6.1",
"symfony/event-dispatcher": "^5.4|^6.0",
diff --git a/src/Symfony/Component/DependencyInjection/Compiler/DefinitionErrorExceptionPass.php b/src/Symfony/Component/DependencyInjection/Compiler/DefinitionErrorExceptionPass.php
index 5f290f91575b0..759b1d22d15ba 100644
--- a/src/Symfony/Component/DependencyInjection/Compiler/DefinitionErrorExceptionPass.php
+++ b/src/Symfony/Component/DependencyInjection/Compiler/DefinitionErrorExceptionPass.php
@@ -25,7 +25,7 @@ class DefinitionErrorExceptionPass extends AbstractRecursivePass
{
protected function processValue(mixed $value, bool $isRoot = false): mixed
{
- if (!$value instanceof Definition || !$value->hasErrors()) {
+ if (!$value instanceof Definition || !$value->hasErrors() || $value->hasTag('container.error')) {
return parent::processValue($value, $isRoot);
}
diff --git a/src/Symfony/Component/DependencyInjection/Dumper/XmlDumper.php b/src/Symfony/Component/DependencyInjection/Dumper/XmlDumper.php
index 74633a4fbbbc5..ae9c790d7274c 100644
--- a/src/Symfony/Component/DependencyInjection/Dumper/XmlDumper.php
+++ b/src/Symfony/Component/DependencyInjection/Dumper/XmlDumper.php
@@ -129,7 +129,9 @@ private function addService(Definition $definition, ?string $id, \DOMElement $pa
}
}
- foreach ($definition->getTags() as $name => $tags) {
+ $tags = $definition->getTags();
+ $tags['container.error'] = array_map(fn ($e) => ['message' => $e], $definition->getErrors());
+ foreach ($tags as $name => $tags) {
foreach ($tags as $attributes) {
$tag = $this->document->createElement('tag');
if (!\array_key_exists('name', $attributes)) {
diff --git a/src/Symfony/Component/DependencyInjection/Dumper/YamlDumper.php b/src/Symfony/Component/DependencyInjection/Dumper/YamlDumper.php
index 802b49a466bab..f12cf9a009814 100644
--- a/src/Symfony/Component/DependencyInjection/Dumper/YamlDumper.php
+++ b/src/Symfony/Component/DependencyInjection/Dumper/YamlDumper.php
@@ -69,7 +69,9 @@ private function addService(string $id, Definition $definition): string
}
$tagsCode = '';
- foreach ($definition->getTags() as $name => $tags) {
+ $tags = $definition->getTags();
+ $tags['container.error'] = array_map(fn ($e) => ['message' => $e], $definition->getErrors());
+ foreach ($tags as $name => $tags) {
foreach ($tags as $attributes) {
$att = [];
foreach ($attributes as $key => $value) {
diff --git a/src/Symfony/Component/DependencyInjection/Loader/FileLoader.php b/src/Symfony/Component/DependencyInjection/Loader/FileLoader.php
index c817f16422f80..c265fb6e8d9f8 100644
--- a/src/Symfony/Component/DependencyInjection/Loader/FileLoader.php
+++ b/src/Symfony/Component/DependencyInjection/Loader/FileLoader.php
@@ -214,6 +214,12 @@ protected function setDefinition(string $id, Definition $definition)
{
$this->container->removeBindings($id);
+ foreach ($definition->getTag('container.error') as $error) {
+ if (isset($error['message'])) {
+ $definition->addError($error['message']);
+ }
+ }
+
if ($this->isLoadingInstanceof) {
if (!$definition instanceof ChildDefinition) {
throw new InvalidArgumentException(sprintf('Invalid type definition "%s": ChildDefinition expected, "%s" given.', $id, get_debug_type($definition)));
diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/DefinitionErrorExceptionPassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/DefinitionErrorExceptionPassTest.php
index b22b934dd80cd..a62fe0cc79153 100644
--- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/DefinitionErrorExceptionPassTest.php
+++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/DefinitionErrorExceptionPassTest.php
@@ -49,4 +49,18 @@ public function testNoExceptionThrown()
$pass->process($container);
$this->assertSame($def, $container->getDefinition('foo_service_id')->getArgument(0));
}
+
+ public function testSkipErrorFromTag()
+ {
+ $container = new ContainerBuilder();
+ $def = new Definition();
+ $def->addError('Things went wrong!');
+ $def->addTag('container.error');
+ $container->register('foo_service_id')
+ ->setArguments([$def]);
+
+ $pass = new DefinitionErrorExceptionPass();
+ $pass->process($container);
+ $this->assertSame($def, $container->getDefinition('foo_service_id')->getArgument(0));
+ }
}
diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services9.xml b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services9.xml
index 9b2462d076068..a873301af0651 100644
--- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services9.xml
+++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services9.xml
@@ -145,7 +145,9 @@
-
+
+
+
diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services9.yml b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services9.yml
index 22a6d5549557e..878a18c795b31 100644
--- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services9.yml
+++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services9.yml
@@ -173,6 +173,8 @@ services:
public: true
errored_definition:
class: stdClass
+ tags:
+ - container.error: { message: 'Service "errored_definition" is broken.' }
preload_sidekick:
class: stdClass
tags: