8000 bug #50260 [DependencyInjection] Fix dumping/loading errored definiti… · symfony/symfony@6222f8e · GitHub
[go: up one dir, main page]

Skip to content

Commit 6222f8e

Browse files
bug #50260 [DependencyInjection] Fix dumping/loading errored definitions in XML/Yaml (nicolas-grekas)
This PR was merged into the 6.3 branch. Discussion ---------- [DependencyInjection] Fix dumping/loading errored definitions in XML/Yaml | Q | A | ------------- | --- | Branch? | 6.3 | Bug fix? | yes | New feature? | no | Deprecations? | no | Tickets | Fix #50258, #50234 | License | MIT | Doc PR | - Commits ------- 3a69c6c [DependencyInjection] Fix dumping/loading errored definitions in XML/Yaml
2 parents c2e7f7a + 3a69c6c commit 6222f8e

File tree

10 files changed

+38
-20
lines changed

10 files changed

+38
-20
lines changed

src/Symfony/Bundle/FrameworkBundle/Command/ContainerLintCommand.php

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,6 @@ private function getContainerBuilder(): ContainerBuilder
8888
return $this->buildContainer();
8989
}, $kernel, $kernel::class);
9090
$container = $buildContainer();
91-
92-
$skippedIds = [];
9391
} else {
9492
if (!$kernelContainer instanceof Container) {
9593
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
10098
$refl = new \ReflectionProperty($parameterBag, 'resolved');
10199
$refl->setValue($parameterBag, true);
102100

103-
$skippedIds = [];
104-
foreach ($container->getServiceIds() as $serviceId) {
105-
if (str_starts_with($serviceId, '.errored.')) {
106-
$skippedIds[$serviceId] = true;
107-
}
108-
}
109-
110101
$container->getCompilerPassConfig()->setBeforeOptimizationPasses([]);
111102
$container->getCompilerPassConfig()->setOptimizationPasses([]);
112103
$container->getCompilerPassConfig()->setBeforeRemovingPasses([]);
@@ -115,7 +106,7 @@ private function getContainerBuilder(): ContainerBuilder
115106
$container->setParameter('container.build_hash', 'lint_container');
116107
$container->setParameter('container.build_id', 'lint_container');
117108

118-
$container->addCompilerPass(new CheckTypeDeclarationsPass(true, $skippedIds), PassConfig::TYPE_AFTER_REMOVING, -100);
109+
$container->addCompilerPass(new CheckTypeDeclarationsPass(true), PassConfig::TYPE_AFTER_REMOVING, -100);
119110

120111
return $this->containerBuilder = $container;
121112
}

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -376,13 +376,12 @@ public function load(array $configs, ContainerBuilder $container)
376376

377377
$this->registerSerializerConfiguration($config['serializer'], $container, $loader);
378378
} else {
379-
$container->register('.argument_resolver.request_payload.no_serializer', Serializer::class)
379+
$container->getDefinition('argument_resolver.request_payload')
380+
->setArguments([])
380381
->addError('You can neither use "#[MapRequestPayload]" nor "#[MapQueryString]" since the Serializer component is not '
381382
.(class_exists(Serializer::class) ? 'enabled. Try setting "framework.serializer" to true.' : 'installed. Try running "composer require symfony/serializer-pack".')
382-
);
383-
384-
$container->getDefinition('argument_resolver.request_payload')
385-
->replaceArgument(0, new Reference('.argument_resolver.request_payload.no_serializer', ContainerInterface::RUNTIME_EXCEPTION_ON_INVALID_REFERENCE))
383+
)
384+
->addTag('container.error')
386385
->clearTag('kernel.event_subscriber');
387386

388387
$container->removeDefinition('console.command.serializer_debug');

src/Symfony/Bundle/FrameworkBundle/composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
"ext-xml": "*",
2222
"symfony/cache": "^5.4|^6.0",
2323
"symfony/config": "^6.1",
24-
"symfony/dependency-injection": "^6.2.8",
24+
"symfony/dependency-injection": "^6.3",
2525
"symfony/deprecation-contracts": "^2.5|^3",
2626
"symfony/error-handler": "^6.1",
2727
"symfony/event-dispatcher": "^5.4|^6.0",

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class DefinitionErrorExceptionPass extends AbstractRecursivePass
2525
{
2626
protected function processValue(mixed $value, bool $isRoot = false): mixed
2727
{
28-
if (!$value instanceof Definition || !$value->hasErrors()) {
28+
if (!$value instanceof Definition || !$value->hasErrors() || $value->hasTag('container.error')) {
2929
return parent::processValue($value, $isRoot);
3030
}
3131

src/Symfony/Component/DependencyInjection/Dumper/XmlDumper.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,9 @@ private function addService(Definition $definition, ?string $id, \DOMElement $pa
129129
}
130130
}
131131

132-
foreach ($definition->getTags() as $name => $tags) {
132+
$tags = $definition->getTags();
133+
$tags['container.error'] = array_map(fn ($e) => ['message' => $e], $definition->getErrors());
134+
foreach ($tags as $name => $tags) {
133135
foreach ($tags as $attributes) {
134136
$tag = $this->document->createElement('tag');
135137
if (!\array_key_exists('name', $attributes)) {

src/Symfony/Component/DependencyInjection/Dumper/YamlDumper.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,9 @@ private function addService(string $id, Definition $definition): string
6969
}
7070

7171
$tagsCode = '';
72-
foreach ($definition->getTags() as $name => $tags) {
72+
$tags = $definition->getTags();
73+
$tags['container.error'] = array_map(fn ($e) => ['message' => $e], $definition->getErrors());
74+
foreach ($tags as $name => $tags) {
7375
foreach ($tags as $attributes) {
7476
$att = [];
7577
foreach ($attributes as $key => $value) {

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,12 @@ protected function setDefinition(string $id, Definition $definition)
214214
{
215215
$this->container->removeBindings($id);
216216

217+
foreach ($definition->getTag('container.error') as $error) {
218+
if (isset($error['message'])) {
219+
$definition->addError($error['message']);
220+
}
221+
}
222+
217223
if ($this->isLoadingInstanceof) {
218224
if (!$definition instanceof ChildDefinition) {
219225
throw new InvalidArgumentException(sprintf('Invalid type definition "%s": ChildDefinition expected, "%s" given.', $id, get_debug_type($definition)));

src/Symfony/Component/DependencyInjection/Tests/Compiler/DefinitionErrorExceptionPassTest.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,18 @@ public function testNoExceptionThrown()
4949
$pass->process($container);
5050
$this->assertSame($def, $container->getDefinition('foo_service_id')->getArgument(0));
5151
}
52+
53+
public function testSkipErrorFromTag()
54+
{
55+
$container = new ContainerBuilder();
56+
$def = new Definition();
57+
$def->addError('Things went wrong!');
58+
$def->addTag('container.error');
59+
$container->register('foo_service_id')
60+
->setArguments([$def]);
61+
62+
$pass = new DefinitionErrorExceptionPass();
63+
$pass->process($container);
64+
$this->assertSame($def, $container->getDefinition('foo_service_id')->getArgument(0));
65+
}
5266
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,9 @@
145145
<service id="runtime_error" class="stdClass" public="true">
146146
<argument type="service" id="errored_definition"/>
147147
</service>
148-
<service id="errored_definition" class="stdClass"/>
148+
<service id="errored_definition" class="stdClass">
149+
<tag name="container.error" message="Service &quot;errored_definition&quot; is broken."/>
150+
</service>
149151
<service id="preload_sidekick" class="stdClass" public="true">
150152
<tag name="container.preload" class="Some\Sidekick1"/>
151153
<tag name="container.preload" class="Some\Sidekick2"/>

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,8 @@ services:
173173
public: true
174174
errored_definition:
175175
class: stdClass
176+
tags:
177+
- container.error: { message: 'Service "errored_definition" is broken.' }
176178
preload_sidekick:
177179
class: stdClass
178180
tags:

0 commit comments

Comments
 (0)
0